strlen не дает правильную длину строки C

Я читаю из своего словаря и распечатываю слово + длину слова для целей тестирования.

Я использую strlen для получения длины строки. Однако цифры, которые я получил, неверны. Я считаю, что strlen не учитывает символ .

Я читаю первые 10 слов в словаре. Мой ожидаемый результат должен быть:

W:A L:1
W:A's L:3
W:AA's L:4
W:AB's L:4
W:ABM's L:5
W:AC's L:4
W:ACTH's L:6
W:AI's L:3
W:AIDS's L:6
W:AM's L:4

но это то, что я получил (обратите внимание, как L:'S находятся на другой линии. Я думаю, вот в чем проблема. is):

W:A
 L:2
W:A's
 L:4
W:AA's
 L:5
W:AB's
 L:5
W:ABM's
 L:6
W:AC's
 L:5
W:ACTH's
 L:7
W:AI's
 L:5
W:AIDS's
 L:7
W:AM's
 L:5

ниже мой код:

FILE* dict = fopen("/usr/share/dict/words", "r"); //open the dictionary for read-only access 
   if(dict == NULL) {
      return;
   }

   int i;
   i = 0;

   // Read each line of the file, and insert the word in hash table
   char word[128];
   while(i < 10 && fgets(word, sizeof(word), dict) != NULL) {
      printf("W:%s L:%dn", word, (int)strlen(word));

      i++;
   }

2 ответов


fgets() читает в новой строке в буфер, если достаточно места. В результате вы видите новую строку, напечатанную при печати word. Из руководства fgets:

fgets () считывает не более одного символа меньше размера из потока и сохраняет их в буфер, на который указывает s. Чтение останавливается после EOF или новая строка. если прочитана новая строка, то она хранится в буфер. Завершающий нулевой байт ('\0') сохраненный после последнего символ в буфере.

(выделено мной)

вы должны обрезать его сам:

while(i < 10 && fgets(word, sizeof(word), dict) != NULL) {
  size_t len = strlen(word);
  if ( len > 0 &&  word[len-1] == '\n' )  word[len] = '';

  printf("W:%s L:%d\n", word, (int)strlen(word));
  i++;
}

причина в том, что fgets тянет символ новой строки '\n' в ваш буфер word каждый раз, приводя к более высокому отсчету 1 каждый раз.