2011-01-01 7 views
0

coloursstd::map<string, string>입니다. 각 쌍의 첫 번째 요소는 2 글자 std::string 색 코드이고, 두 번째 요소는 7 색 std::string 셸 이스케이프 코드입니다.왜이 문자열은 segfault를 검색하고 바꿉니 까?

size_t i; 
for(map<string, string>::iterator iter = colours.begin(); iter != colours.end(); iter++) { 
    while((i = text.find(iter->first)) != string::npos) { 
     text.replace(i, i + sizeof(iter->first), iter->second); 
    } 
} 

이 코드를 실행하면 프로그램이 segfaults됩니다. 내 최선의 추측은 대체 문자열의 길이가 대체 할 문자열의 길이보다 길지만 무언가가 char *이 아닌 std::string 인 segfaults 만 발생할 수 있다고 알고 있습니다.

답변

6

string::replace은 시작 위치와 끝 위치가 아닌 시작 위치와 길이를 취합니다. 또한 sizeof은 문자열의 길이를 반환하지 않습니다. 그래서 세 번째 줄은 아마 읽어야합니다 : 그것은 가치가 무엇인지, sizeof 컴파일 타임에 알려진 객체에 의해 소비 스택 공간의 크기를 반환

text.replace(i, iter->first.length(), iter->second); 

하십시오. 따라서 문자열의 길이에 따라 호출간에 달라질 수 없습니다.

+0

감사합니다. 제안한 변경 사항을 적용했지만이 코드 블록에서는 여전히 프로그램이 segfaults입니다. –

+0

@Not Joe Bloggs, 음. 디버거에서 실행하여 정확히 어떤 조건으로 인해 segfault가 발생하는지 확인하십시오. – luqui

+0

@Not Joe Bloggs 세그 폴트가 발생하는 입력을 제공 할 수 있습니까? – marcog

1

@luqui는 이미 segfaults 이유를 대답했지만 다른 것을 추가하고 싶었습니다.

대체 문자열에 검색 문자열이 포함되어있는 경우 무한 루프가되지 않도록주의하십시오. string::find() 위치에 검색을 시작하면이 문제를 피할 수 있습니다. 또한 현재 솔루션이 O (N)로 변질 될 수 있으므로 효율성이 향상됩니다.

+0

이 경우 검색 및 바꾸기 문자열이 컴파일 타임에 알려 지므로 바꾸기 문자열에 확실히 검색 문자열이 포함되지 않는다고 말할 수 있습니다. –

관련 문제