gpt4 book ai didi

C - 从文本文件中读取字符串并按大小排列

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:46 25 4
gpt4 key购买 nike

我想从文本文件中读取字符串(每行一个字符串/单词),然后按大小排列它们。

这是我的代码:

void readDic(char* file)
{
FILE* fr;
fr=fopen(file, "rt"); // opening the text file
char line[MAX_LINE_SIZE];
char* word;
while(fgets(line, MAX_LINE_SIZE, fr)!=NULL)
{
if(line[0]!='\n')
{
word = strtok(line, "\n"); //remove the newline from the string
// do stuff with word
}
}
fclose(fr);
}

虽然这段代码运行了,但我读取的每个字符串(除了最后一个)的大小都比文件中的字符串大 1。

例如,字符串“hello”的 strlen 如果它位于文件最后一行以外的任何位置,则返回 6。如果它在文件的最后一行,则 strlen 返回 5。

我做错了什么吗?

最佳答案

fgets() 不读取 C 字符串。它读取 chars 直到遇到 '\n'(或 EOF 条件,或 IO 错误或缓冲区几乎已满)。然后它将一个 '\0' 附加到缓冲区,使缓冲区成为一个 C 字符串。

调用 fgets() 后,最好检查它的返回值 - 此代码所做的。如果 NULL,则存在 EOF 条件或 IO 错误。否则缓冲区包含 C 字符串:1) char 数组,2) 通常最后一个是 '\n' 和 3) 附加的 '\0'.

strlen(line) 看似超长的结果来自 '\n',您的文本文件的最后一行没有。

建议删除可能尾随的 '\n':

size_t len = strlne(line);
if (len > 0 && line[len-1] == '\n') line[--len] = '\0';

行尾因系统而异:"\r\n""\n" 很流行,但是 "\n\r""\r" 已经发生。通过将文件打开为文本文件“rt”,或使用“r” 更便于携带,系统的典型行结束转换为"\n" 因为 fgets() 从底层 IO 请求数据。考虑到编辑器之间的差异,代码正在读取的文本文件可能使用了意外行结尾,并且未按上述方式翻译。

关于C - 从文本文件中读取字符串并按大小排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23162225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com