2016-10-20 3 views
0

와 문자열을 비교할 때 긍정적 인 반환 I C에 다음 코드를 가지고 :C의 STRCMP()는 문자 포인터

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 

    char *buf; 

    buf = malloc(sizeof(char) * 512); 


    while(strcmp(buf, "Exit!") != 0) 
    { 
     printf("Enter something:"); 
     fgets(buf, sizeof(char) * 512, stdin); 
     printf("You entered %s\n", buf); 

     printf("%d\n", strcmp(buf, "Exit!")); 

    } 

} 

내가 원하는 동작은 사용자가 지정한 string을 입력하면 종료 할 while 루프입니다. 내가 이해 한대로 char 포인터를 사용하여 string을 C로 나타낼 수 있습니다. fgets()을 사용하여 사용자 입력을 저장하고 strcmp() 함수를 사용하여 비교합니다. 이 비교 결과를 출력하는 디버그 문을 추가하고 "종료"를 입력하면 양의 정수를 반환합니다. while 루프를 종료해야합니다.

내가 누락 된 내용을 설명 할 수 있습니까? 나는 그것이 새로운 라인 문자 또는 C-String 터미네이터와 관련이 있다고 믿는다. \0. 사용자가 "Exit"를 입력 할 때 while 루프를 종료하려면 어떻게해야합니까?

+0

'fgets' *이와 *가 읽고 각 라인에 후행 ''\ n''이 포함되어 있습니다. –

+0

'fgets'가'NULL'을 반환하면 루프를'중단 '해야합니다. 그 체크가 없으면 사용자가'EOF'를 생성하는 키 조합을 누르면 무한 루프가됩니다. 이 키 조합은 유닉스 시스템에서는 control-D이고 윈도우에서는 control-Z이다. – user3386109

+0

'malloc' 다음에는'buf [0] = '\ 0';'행이 있어야합니다.'malloc'에 의해 반환 된 버퍼에 문자열 "Exit!"가 포함될 가능성은 거의 없습니다. ' – user3386109

답변

1

fgets은 키보드에서 입력 한 newline을 그대로 유지하거나 텍스트 파일에서 줄 끝을 표시했기 때문입니다. 그것은이처럼 제거 할 수

한 가지 간단한 방법 : 읽기

#include <string.h> 

//... 

buf [ strcspn(buf, "\r\n") ] = 0; // remove trailing newline etc 
+0

분명히 나쁜 생각입니다. 패턴이 문자열에 없으면 1 바이트만큼 buf를 오버플로 할 수 있습니까? –

+1

@SectoKia 완전히 안전합니다. '\ n' 또는'\ r'도 존재하지 않으면, 기존의'\\ '터미네이터를 덮어 씁니다. 그렇지 않으면 첫 번째 매치를 덮어 씁니다. –