2017-01-08 4 views
0

함수 int compare (...)은 두 문자열이 인 경우를 제외하고 대/소문자를 제외한 모든 문자를 확인합니다. "a? ...! b"는 "ab"와 같습니다. 같으면 1을 반환하고, 그렇지 않으면 0을 반환합니다. 그러나 내 코드에는 버그가 있습니다! 나는 시도하고 예를 들어,이 코드를 실행하면두 문자열의 순차 비교

int compare(const char* string1, const char* string2) 
{ 
    if(string1 == NULL || string2 == NULL) 
    return 0; 

    std::cout << *string1 << " | " << *string2 << std::endl; 
    if((!isalpha(*string1) && *string1 != ' ') && (!isalpha(*string2) && *string2 != ' ')) 
    { 
     compare(++string1,++string2); 
    } 
    else if(!isalpha(*string1) && *string1 != ' ') 
    { 
     compare(++string1,string2); 
    } 
    else if(!isalpha(*string2) && *string2 != ' ') 
    { 
    compare(string1, ++string2); 
    } 

    if(tolower(*string1) != tolower(*string2)) 
    return 0; 
    if(*string1 == '\0') 
    return 1; 
    if(*string1 == *string2) 
    compare(++string1, ++string2); 
} 

는 :

compare("a !!!b", "a b"); 

출력은 정말 날 혼란 : 그것은 0을 반환 (같지 않음)

a | b 
    | 
! | 
! | 
! | 
b | b 
^@| ^@ 
    | a 
^@| ^@ 
    | a 

. 일단 도달하면 실행을 멈추지 않습니다 b | b, 이유가 무엇입니까?

+0

당신은 compare''에 대한 각 호출하기 전에'return'을 둘 필요가 그렇지 않은 경우, 두 문자열이 비어 및 이전 버전 기능에 따라서 동일한 경우, 당신은 확인해야 그것은 재귀 적으로'compare'를 호출 할 것이지만 그때 함수를 계속 실행합니다. –

+0

'char' 값을 가진''함수를 사용하면'char' 값이 음수 일 때 정의되지 않은 동작이 일어납니다. 'char' 값을 ''의 함수 중 하나에 전달하기 전에'unsigned char'로 형변환해야합니다. –

+0

@JohnnyMopp에 언급 된 것 외에도 함수의 마지막에는 return 문이 없습니다. return 문없이'void'와 다른 무언가를 반환하는 함수의 끝에서 떨어지는 것은 정의되지 않은 동작입니다. –

답변

1

return 성명 외에도 논리에 결함이 있습니다.

int compare(const char* string1, const char* string2) 
{ 
    if(string1 == NULL || string2 == NULL) 
     return 0; 

    // This needs to go here 
    if(*string1 == '\0' && *string2 == '\0') { 
     return 1; 
    } 

    std::cout << *string1 << " | " << *string2 << std::endl; 
    if((!isalpha(*string1) && *string1 != ' ') && (!isalpha(*string2) && *string2 != ' ')) 
    { 
     return compare(++string1,++string2); 
    } 
    else if(!isalpha(*string1) && *string1 != ' ') 
    { 
     return compare(++string1,string2); 
    } 
    else if(!isalpha(*string2) && *string2 != ' ') 
    { 
     return compare(string1, ++string2); 
    } 

    if(tolower(*string1) != tolower(*string2)) 
     return 0; 
    if(*string1 == *string2) 
     return compare(++string1, ++string2); 
} 

당신은 여기에서 확인할 수 있습니다 : https://ideone.com/Si78Nz

+0

아, 얼마나 바보 야. 이제 알았어! 고맙습니다! – Alexander