2016-01-21 2 views
0

У меня есть текстовый файл, который выглядит следующим образом:STRCMP не возвращает 0

TEMP:88 
TT:33 
3d;3d:5 

Я пытаюсь разобрать первую строку только, и убедитесь, что это действительно «TEMP: 88»

Это это то, что я пробовал:

FILE * file = fopen("test.txt","r"); 

if(file == NULL) 
    exit(0); 
char buff[128]; 

while(fgets(buff,sizeof(buff),file) != NULL) { 
    if(strcmp(buff,"TEMP:88") == 0) 
     printf("TRUE"); 
    else 
     printf("FALSE"); //prints false, regardless of newline character, use of memcopy or anything else 
    break; 
} 

Затем я попытался добавить символ новой строки «\ п» внутри STRCMP который давал те же результаты, и ает копию также дали тот же результат, любые идеи?

+2

попробуйте напечатать содержание нагишом (лучше напечатать код ASCII) –

+0

Он печатает правильную строку «ТЕМП: 88» – EDEDED

+1

Параметр '\ n' * должен * быть включен ; учитывая это, сравнение работает так, как ожидалось здесь: https://ideone.com/WY3OHM –

ответ

-1

Просто, чтобы дополнить одну из представленных выше комментариев, ссылаясь на следующую ссылку:

http://www.cplusplus.com/reference/cstdio/fgets/

Символ новой строки делает fgets перестают читать, но это считается действительный характер по функции и включены в строка скопирована на ул.

Так что да, вы должны включить \ п в сравнении

+0

Вопрос гласит, что включение новой строки не помогло. – Barmar

+0

Просто интересно, если символ конца строки в этом случае не является CRLF Windows, а не символом LF. Возможно, это может привести к сбою сравнения. – ospet

+0

Это еще одна возможность. – Barmar

0

Снизу исходного кода

FILE * file = fopen("test.txt","r"); 
if(file == NULL) 
    exit(0); 
char buff[128]; 

while(fgets(buff,sizeof(buff),file) != NULL) { 
    printf("%s,%d\n",buff,strlen(buff)); 
    int i= 0; 
    while(i<strlen(buff)) 
    { 
     printf("%d\n",buff[i]); 
     i++; 
    } 
    if(strcmp(buff,"TEMP:88") == 0) 
     printf("TRUE"); 
    else 
     printf("FALSE"); //prints false, regardless of newline character, use of memcopy or anything else 
    break; 
} 

его из пут,

$ ./a.exe TEMP : 88, 9 84 69 77 80 58 56 56 13 10 FALSE

Эти значения ASCII и длина строки показывают, что ваша строка чтения не является «TEMP: 88». Буфер чтения содержит значения ASCII LF и CR в конце.

Таким образом, вы можете использовать

strncmp(buff,"TEMP:88",strlen("TEMP:88")); 
+0

Вы не должны получать 13 на выходе, если только вы не открываете текстовый файл Windows под ОС Windows –

+0

Я знаю это.Я просто хочу сообщить ему о «strncmp» – jjb

+0

Это использование strncmp также соответствовало бы «TEMP: 886» 'например –

Смежные вопросы