2016-12-08 1 views
7

포인터를 사용한 연산을 사용하여 strcmp 함수를 직접 작성해야합니다.C에서 Strсmp() 함수 구현

int mystrcmp(const char *str1, const char *str2) { 
    while ('\0' != *str1 && *str1 == *str2) { 
     str1 += 1; 
     str2++; 
    } 
    int result1 = (uint8_t)(*str2) - (uint8_t)(*str1); // I need (uint8_t) to use it with Russian symbols. 
    return result1; 
} 

하지만 내 교사 내 코드의 작은 실수가 있다는 것을 저에게 말했다 : 그건 내가 무엇을 가지고 있습니다. 나는 정말로 많은 시간을 테스트를 보내지 만 그것을 찾을 수 없었다. 도와주세요.

+4

왜 'str1 + = 1'이 아닌'str2 ++'을 사용하고 있습니까? 또한'str2'가'str1'보다 짧을 가능성을 검사하지 않습니다. –

+1

코드를 변경하지 마십시오. 실제 코드에'str1 ++'또는'str1 + = 1'이 있습니까? –

+0

테스트 후 변경을 잊어 버렸습니다. 내 코드는 str1 ++입니다. – Parket

답변

9

이 질문에 대한 답변이 잘못 되었습니까?

#include <stdio.h> 
#include <stdint.h> 
#include <string.h> 

int mystrcmp(const char *str1, const char *str2); 

int main(void) 
{ 
    char* javascript = "JavaScript"; 
    char* java = "Java"; 

    printf("%d\n", mystrcmp(javascript, java)); 
    printf("%d\n", strcmp(javascript, java)); 
    return 0; 
} 

int mystrcmp(const char *str1, const char *str2) { 
    while ('\0' != *str1 && *str1 == *str2) { 
     str1 += 1; 
     str2++; 
    } 
    int result1 = (uint8_t)(*str2) - (uint8_t)(*str1); // I need (uint8_t) to use it with Russian symbols. 
    return result1; 
} 

출력 :

int result1 = (uint8_t)(*str2) - (uint8_t)(*str1); 

으로

변경 :

-83 
83 

내가 가 빠른 수정을 제안합니다

int result1 = (uint8_t)(*str1) - (uint8_t)(*str2); 

그리고 당신은 틀린 이유 : strcmp()

반환 값은해야한다 : 반환 값 < 0 다음은 str1과 str2가보다 작 나타냅니다

합니다.

반환 값> 0 인 경우 str2가 str1보다 작음을 나타냅니다.

반환 값 = 0이면 str1이 str2와 같음을 나타냅니다.

당신은 정확히 그 반대입니다.

+0

오, 나는 실수가 너무 쉽다는 것에 매우 실망했다. 고맙습니다. 너무 바보 같은 질문에 시간을 보내 게해서 죄송합니다. – Parket

5

@yLaguardia 잘 주문 문제.

int strcmp(const char *s1, const char *s2); 

strcmp 함수 문자열 s1 가리키는 따라서 같은 문자열이 s2가 가리키는 것보다보다 같거나 작 정수,보다 같거나 0보다 작은 반환 . 3


uint8_t를 사용 C11dr §7.24.4.2는 대부분의 경우에 괜찮습니다. 희귀 기계는 8 비트 char을 사용하지 않으므로 uint8_t을 사용할 수 없습니다. 어떤 경우 든 unsigned char이 필요한 을 처리해야하므로 필요하지 않습니다.을 비교하십시오. (부호없는 비교에 대해서는 아래를 참조하십시오.)

int result1 = 
    ((unsigned char)*str1 - (unsigned char)*str2); 

더 높은 휴대용 코드를 처리하기 위해 다음을 사용하는 경우 char 범위와 unsigned 범위 일치뿐만 아니라 다른 모든 char, unsigned char, int, unsigned 크기/범위.


strcmp()

int result1 = 
    ((unsigned char)*str1 > (unsigned char)*str2) - 
    ((unsigned char)*str1 < (unsigned char)*str2); 

char 서명 또는 서명되지 않은 경우에 관계없이, unsigned char 각 문자의 치료로 정의됩니다.

... 각 문자는이 유형 unsigned char했다 것처럼 char가 ASCII 일해야 ... C11 §7.24.1 3


해석 여부를 관련이 없습니다하여야한다 strcmp()의 코딩. 물론 다른 문자 인코딩에서 다른 결과가 발생할 수 있습니다. 예 : strcmp("A", "a")은 인코딩이 하나 뿐인 긍정 응답 (거의 사용되지 않고 EBCDIC)이 될 수 있지만 다른 인코딩에서는 음수 (ASCII)가됩니다.