2013-10-20 2 views
2

stdin에서 읽은 행이 "login :"으로 시작하는지 확인하려고하지만 strcmp가 작동하지 않는 것 같습니다.두 문자열 비교 strcmp 문제

char s1[20], s2[20]; 
fgets(s1, 20, stdin); 
strncpy(s2,s1,6); 
strcmp(s2, "login:"); 
if(strcmp(s2, "login:") == 0) 
    printf("s2 = \"login:\"\n"); 
else 
    printf("s2 != \"login:\"\n"); 

"login :"뒤에 오는 것이 마음에 들지 않습니다. 그게 명령이 주어지는 방식입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+1

'strcmp'는 ** exact ** matches입니다. 나는이 작업을 위해 사용할 수있는 다른 함수가 있는지 보려면 [C 문자열 라이브러리] (http://en.cppreference.com/w/c/string/byte)를 확인하는 것이 좋습니다 ... –

+0

처음 6 개를 복사하고 있습니다. 문자 ("login :"이어야 함)를 "login :"문자열과 비교할 다른 문자열로 변환해야합니다. 그래서 정확하게 일치 할 것입니다. –

+0

아, 그게 중요한 포인트입니다. 나는 그것을 알아 채지 못했다. –

답변

5

strcmp 0을 반환은 두 문자열은 당신이 원하는 것을 달성 정확히 같은 경우

사용 : 문자열이 s2에 존재하지 않는 경우

strstr(s2 , "login:")

(그것은 NULL를 반환)

또는

strncmp(s2 , "login:" , 6)

(s2로 시작하는 경우 "로그인", 그것은 0을 반환합니다)이 첫 6 개 문자를 비교합니다

1

C의 모든 문자열은

때를 보여줍니다 널 (NULL) 종료 될 다음에 문자열의 끝이 발생합니다.

는 지금, 당신이 당신이 널 (NULL) 종료를 복사되지 않음을 의미

login: 

인 S2와 S1에서 6 편지를 복사하고 있습니다.

그래서 s2는 원하는대로 정확하게 "로그인 :"되지 않습니다. (S2)에 포함되어 있습니다 : 로그인이 있는지 확인하는

strstr(s2, "login:") 

를 사용하여 오히려

은 그래서 좋습니다.

0
char s1[20], s2[20]; 
fgets(s1, 20, stdin); 
strncpy(s2,s1,6); 
strcmp(s2, "login:"); 
if(strcmp(s2, "login:") == 0) 
    printf("s2 = \"login:\"\n"); 
else 
    printf("s2 != \"login:\"\n"); 

다음과 같은 문자가 포함되어있는 "로그인"으로 문자열 비교 : '문자열이 동일해야합니다 그래서 만약'0 \ '' '난'o''g''i''n를 ' s2에 '\ 0'이 있어야합니다. 다음 코드가 작동해야합니다 :

char s1[20], s2[20]; 
fgets(s1, 20, stdin); 
strncpy(s2,s1,6); 
s2[6]='\0'; //end of String 
strcmp(s2, "login:"); 
if(strcmp(s2, "login:") == 0) 
    printf("s2 = \"login:\"\n"); 
else 
    printf("s2 != \"login:\"\n")