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;
}
Другие вопросы по тегам