2016-10-26 10 views
0

두 C 스타일 문자열에서 대소 문자를 구분하지 않는 strcmp를 수행하려고합니다.C 스타일 문자열에 대해 아래쪽으로

C 스타일 문자열을 소문자로 변환하는 기능이 있습니다.

char* ToLowerCase(const char* str) 
{ 
    char buffer[strlen(str)]; 
    for (int i=0; i<strlen(str); ++i) 
     buffer[i] = char(tolower(str[i])); 
    return buffer; 
} 

한 문자열 함수 숯 *의 GetMyString (Ⅰ INT)에서 유래하고, 두 번째는 char C 스타일 스트링 어레이에 myStrings * [5].

그래서 가정 모두 GetMyString (0)와 mystring에 [0] 모두 복귀 "TEXT"

strcmp(ToLowerCase(GetMyString(0)), ToLowerCase(myStrings[0])); 

는 "mytextxaogs5atx" "mytextxabs5atx"와 같은 문자열을 비교한다 (어떤 임의의 텍스트가 더해진다 ...)

그 난 당신 중 일부는 생각으로 널 종료와는 아무 상관이 없다 가정 있도록

동안
strcmp(GetMyString(0), myStrings[0]); 

, 그냥 잘 작동합니다.

내 코드가 잘못되었습니다. 내가 뭐 놓친 거 없니? 나는 tolower에 관한 많은 질문을 보았지만 그들 중 누구도 내 문제를 도울 수 없었다.

+0

당신은 정의되지 않은 행동을합니다. 그 이유가 있습니다. –

+0

심각한 프로젝트에서 이러한 기능을 사용해야하는 경우에는 부스트 라이브러리로 이동하여 다른 문자 집합 문제가 발생하지 않도록하십시오. – seccpur

+0

반환 후에 버퍼가 반환되지 않습니다. 무엇이'char (tolower (str [i]))'를 의미합니까? 'tolower (str [i])'충분해야한다. – Holger

답변

1
return buffer; 

당신은 ToLowerCase 로컬의 변수에 대한 포인터를 반환 포인터 포인터 역 참조하려고 할 때 정의되지 않은 동작의 결과로, 호출 후 쓰레기를 가리 킵니다. str 자체를 변경하거나 buffer에 동적으로 메모리를 할당하십시오.

+0

와우 나는 그것을 몰랐다! 해명에 대한 해답을 가져 주셔서 감사합니다. – Ilo

3

함수에서 지역 변수를 반환 할 수 없으므로 buffer을 반환하면 정의되지 않은 동작이됩니다.

  • 는 const가 아닌 str을 가지고 장소
  • 에 수정을 수행 호출자에서 문자열 버퍼를 가지고, 그리고 중 하나가 충분이 있다고 가정 :

    는이 API를 만들기 위해 세 가지 선택이있다 길이 또는 버퍼의 크기를 취하십시오 (훨씬 안전합니다)

  • malloc 문자열을 반환하십시오. 이것은 호출자가 결과를 해제해야합니다. 이 경로를 결정하려면 null 종결자를 수용하기 위해 mallocstrlen(str)+1 바이트가 필요합니다.