std :: string으로 조건부 중단 점을 만드는 방법


82

이 기능이 있다고 가정합니다.

std::string Func1(std::string myString)
{
   //do some string processing 
   std::string newString = Func2(myString)
   return newString;  
}

newString특정 값이 있을 때 조건부 중단을 어떻게 설정 합니까? (소스를 변경하지 않고)

조건 설정 newString == "my value"

작동하지 않음 중단 점이 "오버로드 된 연산자를 찾을 수 없음"오류와 함께 비활성화되었습니다.


1
이것이 의도인지 모르겠지만 코드가 손상되었습니다. Func1은 void를 반환하지만 std :: string을 반환합니다. Func2는 표시되지 않지만 std :: string을 반환하지 않을 것입니다. 또한 = (할당) 대신 == (같음) 연산자를 사용하고 있습니다.
falstro

내 쪽의 나쁜 예는 수정되었지만 std :: string을 사용하여 조건부 중단 점을 작동시키는 문제를 설명하는 것이 었습니다
Eli

답변:


49

일부 검색은이를 수행하는 방법을 찾지 못했습니다. 제안 된 대안은 코드에 테스트를 넣고 표준 중단 점을 추가하는 것입니다.

if (myStr == "xyz")
{
    // Set breakpoint here
}

또는 개별 문자 비교에서 테스트를 구축 할 수 있습니다. 문자열의 개별 문자를 보는 것조차 약간 어색합니다. Visual Studio 2005에서는 다음과 같은 멤버 변수를 파헤쳐 야했습니다.

myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'

이러한 접근 방식 중 어느 것도 매우 만족스럽지 않습니다. 표준 라이브러리의 유비쿼터스 기능에 더 잘 액세스 할 수 있어야합니다.


+1. 나는 비슷한 대답을 썼다. 내가 아는 유일한 방법은 구현 내부를 들여다 보는 것입니다. std :: string의 경우 짧은 문자열 최적화로 인해 매우 복잡해질 수 있습니다.
Adrian McCarthy

myStr._Bx._Buf경우에만 유효한 문제가 myStr._Mysize < _BUF_SIZE있습니다. 그렇지 않으면 사용해야합니다myStr._Bx._Ptr
RunHolt

3
이 답변은 더 이상 최신 Visual Studio와 관련이 없습니다. strcmp(myStr._Mypair._Myval2._Bx._Ptr, "xyz") == 0단지 일
마이클 Veksler

85

Visual Studio 2010/2012에는 훨씬 더 쉬운 방법이 있습니다.

ANSI에서 원하는 것을 달성하려면 다음을 사용하십시오.

strcmp(newString._Bx._Ptr,"my value")==0 

그리고 유니 코드에서 (newString이 유니 코드 인 경우) 다음을 사용하십시오.

wcscmp(newString._Bx._Ptr, L"my value")==0 

비교하는 것보다 할 수있는 일이 더 많습니다. 여기에서 더 많은 것을 읽을 수 있습니다.

http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-cc-developers-using-string-functions-in-conditional- breakpoints.aspx


나는이 대답이 마음에 들었습니다 (메모리에 액세스 할 수없는 일부 예외가 있음).
2013 년

23
다른 의견이 제안했듯이 newString._Bx._Ptr짧은 문자열에 대해서는 액세스 가 작동하지 않을 수 있습니다. 제 경우에는 "보호 된 메모리를 읽거나 쓰려고 시도했습니다"라는 메시지가 표시됩니다. 짧은 문자열 (16 자 이하?)의 newString._Bx._Buf경우 문자를 보유하는 것 같습니다.
vvnurmi 2013

1
VS2015에서도 작동해야합니까? 내 말에 작동하지 않기 때문에 ...
BmyGuest

1
VS에 대해서는 모르지만 gdb의 경우 strcmp(newString.c_str(), "my_value") == 0. 더 많은 계산 내부가 필요할 수 있지만 기억하기가 더 쉽습니다.
Jounathaen

1
@Jounathaen 안타깝게도 VS에서 작동하지 않습니다. "이 표현은 부작용이 있으며 평가되지 않습니다."
letmaik

19

VS2017에서는 할 수 있습니다.

strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0

3
실제로 사용중인 Windows SDK에 따라 다릅니다. Visual Studio 2015에서 10.1.15068을 사용하고 있는데 이것은 작동하지만 string._Bx._Buf 또는 string._Bx._Ptr은 그렇지 않습니다.
Stuart Welch

16

VS2017에서 조건을 다음과 같이 설정할 수있었습니다.

strcmp(&newString[0], "my value") == 0

1
VS2019에서도 작동하며 다른 모든 답변보다 훨씬 더 명확하고 읽기 쉽고 기억하기 쉽습니다.
Scott Hutchinson

8

Brad의 답변과 유사한 것을 사용하여이 문제를 해결해야했지만 ( 코드에서 바로 분리하기 위해 DebugBreak () 사용 ) 때로는 약간의 코드를 편집 / 재 컴파일 / 재실행하는 것이 너무 시간이 많이 걸리거나 불가능합니다. .

운 좋게도 std :: string 클래스의 실제 멤버로 스펠링하는 것이 가능합니다. 여기에 한 가지 방법이 언급되어 있습니다. 그가 VS2010을 구체적 으로 언급 했지만 이전 버전에서는 여전히 개별 문자에 수동으로 액세스 할 수 있습니다. 따라서 2010을 사용하는 경우 멋진 strcmp()기능 등을 사용할 수 있습니다 ( 추가 정보) .하지만 저와 같고 2008 년 이전 버전을 사용하고 있다면 거칠고 끔찍하지만 기능적인 대안을 생각 해낼 수 있습니다. 중단 점 조건을 다음과 같이 설정하여 :

strVar._Bx._Ptr[0] == 'a' && strVar._Bx._Ptr[1] == 'b' &&
   strVar._Bx._Ptr[2] == 'c'

strVar의 처음 세 문자가 "abc"이면 중단됩니다. 물론 추가 문자로 계속 진행할 수 있습니다. 못 생겼어 .. 근데 시간이 좀 절약 됐어.



3

@OBWANDO (거의)에는 해결책 이 있지만 여러 주석이 올바르게 지적했듯이 실제 버퍼는 문자열 크기에 따라 다릅니다. 나는 16이 문턱이라고 본다. 적절한 버퍼의 strcmp 앞에 크기 검사를 추가하면 작동합니다.

newString._Mysize < 16 && strcmp(newString._Bx._Buf, "test value") == 0

또는

newString._Mysize >= 16 && strcmp(newString._Bx._Ptr, "ultra super long test value") == 0

이것은 작은 버퍼 최적화의 결과입니다. 자세한 내용은 blogs.msmvps.com/gdicanio/2016/11/17/…을 참조하세요 . 더 자세한 정보는 여기 akrzemi1.wordpress.com/2014/04/14/common-optimizations
Aerom Xundes 19 년

네, 올바른 해결책입니다. 언급했듯이 작은 문자열 최적화는 문자열 길이가 16 미만이면 메모리를 할당하지 않습니다
Serge Weinstock

2

사용하는 시도 strcmpgdb8.1아래 ubuntu18.04,하지만 작동하지 않습니다

(ins)(gdb) p strcmp("a", "b")
$20 = (int (*)(const char *, const char *)) 0x7ffff5179d60 <__strcmp_ssse3>

이에 따라 대답 , strcmp특별한이다 IFUNC ,이 같은 일 명 캔 설치 조건 :

condition 1 __strcmp_ssse3(camera->_name.c_str(), "ping")==0

꽤 추하고 두 번째로하고 싶지 않습니다.

답변 은 훨씬 더 나은 솔루션을 제공하며 std :: string :: compare 사용합니다 .

condition 1 camera->_name.compare("ping") == 0


1

문자열 비교는 문자를 비교하는 것보다 더 효과적입니다.

strcmp(name._Mypair._Myval2._Bx._Buf, "foo")==0

이것은 작동하지만 사용하기가 매우 불편하고 오류가 발생하기 쉽습니다.

name._Mypair._Myval2._Bx._Buf[0] == 'f' && 
name._Mypair._Myval2._Bx._Buf[1] == '0' && 
name._Mypair._Myval2._Bx._Buf[2] == '0'

1

다음 c_str()과 같이 사용하여 ac 문자열로 변환 할 수 있습니다 .

$_streq(myStr.c_str(), "foo")

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.