strcmp говорит, что идентичные строки не равны - PullRequest
0 голосов
/ 08 февраля 2019

Я использую strcmp для сравнения двух строк.lhs приходит из файлового потока через fgets.rhs создается сгенерированным циклом for как последовательность n-1 пробелов.


Пример

#include <string.h>
#include <stdio.h>

int main() {
  size_t n = 10;
  char rhs[n];

  memset(rhs, ' ', n - 1); // Fill with spaces using memset()
  rhs[n-1] = 0; // Add NUL terminator

  printf("len=%zu\n", strlen(rhs));

  char lhs[n];

  FILE* file = fopen("test", "r");
  fgets(lhs, sizeof(lhs), file);
  printf("read=%s\n", lhs);

  return 0;
}


При использовании gdb я найдучто у меня есть две строки, которые кажутся идентичными (для этого я использовал print GDB):

lhs = " "

rhs = " "

1024 *.Это должно вернуть 0, указывающее, что строки идентичны, но вместо этого я получаю другое ненулевое значение.

Почему эти строки не считаются равными?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

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

#include <string.h>
#include <stdio.h>

int main() {
  size_t n = 10;
  char rhs[n];

  memset(rhs, ' ', n - 1); // Fill with spaces using memset()
  rhs[n-1] = 0; // Add NUL terminator

  printf("len=%zu\n", strlen(rhs));

  char lhs[n];

  FILE* file = fopen("test", "r");
  fgets(lhs, sizeof(lhs), file);
  printf("read=%s\n", lhs);

  return 0;
}

Где здесь важно , а не назначать из fgetsЭто предупреждение, если у вас включен -Wall.

0 голосов
/ 09 февраля 2019

Строка, которая вводится в ваш буфер, не является той же самой, и вы пренебрегаете добавлением нулевого терминатора, что означает, что строковые программы будут продолжать читать строку в буфер, пока не найдут нулевой терминатор, запустив следующий код:нам это:

size_t n = 5;
char lhs[n];
char rhs[n];
for(int i = 0; i < n-1; i++)
    rhs[i] = ' ';
for(int i = 0; rhs[i]; i++)
    printf("| %d ", rhs[i]);

Вывод:

|32 |32 |32 |32 |неизвестные значения ..., могут быть 0, но до тех пор все еще часть массива

Вы должны думать о массиве как адрес памяти, особенно при передаче его функции

Вы должны написать это так:

for(int i = 0; i < n-1; i++)
    rhs[i] = ' ';
rhs[n-1] = '\x00'; // null terminator
...