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 каждый раз.