c - strcmp не возвращает 0 для одинаковых строк
Поэтому я попытался найти решение этой проблемы, но на самом деле могу найти только сообщения, в которых новая строка или нулевой байт отсутствуют в одной из строк. Я уверен, что это не тот случай.
Я использую следующую функцию для сравнения слова с файлом, содержащим список слов с одним словом в каждой строке (словарь в функции). Вот код:
int isWord(char * word,char * dictionary){
FILE *fp;
fp = fopen(dictionary,"r");
if(fp == NULL){
printf("error: dictionary cannot be opened\n");
return 0;
}
if(strlen(word)>17){
printf("error: word cannot be >16 characters\n");
return 0;
}
char longWord[18];
strcpy(longWord,word);
strcat(longWord,"\n");
char readValue[50] = "a\n";
while (fgets(readValue,50,fp) != NULL && strcmp(readValue,longWord) != 0){
printf("r:%sw:%s%d\n",readValue,longWord,strcmp(longWord,readValue));//this line is in for debugging
}
if(strcmp(readValue,longWord) == 0){
return 1;
}
else{
return 0;
}
}
Код компилируется без ошибок, и функция прекрасно читает файл словаря и выводит список слов по мере их появления. Проблема, с которой я столкнулся, заключается в том, что даже когда две строки идентичны, strcmp не возвращает 0, и поэтому функция будет возвращать false для любого ввода.
например, я получаю:
r:zymoscope
w:zymoscope
-3
Есть идеи? Я чувствую, что, должно быть, упускаю что-то очевидное, но не смог ничего найти в своих поисках.
2 ответа
Я вижу, вы добавляете newline
к вашим тестовым строкам, чтобы попытаться справиться с проблемой fgets()
сохраняя окончания строк. Намного лучше это исправить у источника. Вы можете убрать все конечные вещи, как это, сразу после чтения из файла.
readValue [ strcspn(readValue, "\r\n") ] = '\0'; // remove trailing newline etc
Строка, которую вы читаете, содержит завершающие символы и, следовательно, не совпадает со строкой, с которой вы сравниваете ее.
Удалить завершающий символ новой строки (и CR, если он есть); тогда вам не нужно добавлять новую строку или возврат каретки к сравниваемой строке:
int isWord(char *word, char *dictionary){
FILE *fp;
fp = fopen(dictionary, "r");
if (fp == NULL){
fprintf(stderr, "error: dictionary cannot be opened\n");
return 0;
}
if (strlen(word) > 16){
fprintf(stderr, "error: word cannot be >16 characters\n");
return 0;
}
char readValue[50];
while (fgets(readValue, 50, fp) != NULL){
char *ep = &readValue[strlen(readValue)-1];
while (*ep == '\n' || *ep == '\r'){
*ep-- = '\0';
}
if (strcmp(readValue, word) == 0){
return 1;
}
}
return 0;
}