C - getline() 和 strcmp() 问题

C - getline() and strcmp() issue

我遇到一个问题,在使用 getline 时,我无法通过 strcmp() 在文件中找到特定单词。

我的文件看起来像这样:

Word1
Word2
Word3
section1
Word4

这是我现在拥有的代码:

while(found == 0)
{
    getline(&input, &len, *stream);
    if (feof(*stream))
        break;

    if(strcmp(input, "section1\n") == 0)
    {
        printf("End of section\n");
        found = 1;
    }
}

strcmp() 从不 returns 0。任何见解将不胜感激!

对代码进行了编辑。我转错了。

评论中的解决方案: 我需要将 \r 添加到被比较的字符串中

if(strcmp(input, "section1\r\n") == 0)

在这种情况下不需要您使用 feof。您正在使用 getlinestrcmp 来测试线路。使用getline中的return测试是否继续阅读。正确的实现类似于:

while (getline(&input, &len, *stream) != -1)
{
    if(strcmp (input, "section1\n") == 0)
    {
        printf("End of section\n");
        found = 1;
        break;  /* if you want to terminate read when found=1 */
    }
}

要消除阅读的每行末尾悬空 newlines 的问题,只需将其删除即可。 getline 使这变得非常简单,因为它 return 是实际读取的字符数——无需调用 strlen。只需在变量中捕获 getline 的 return,然后删除 newline(如果使用 DOS 行结束,则删除 carriage returnnewline),如下所示:

ssize_t nchr = 0;   /* number of characters actually read */

while ((nchr = getline (&input, &len, *stream)) != -1)
{
    /* strip trailing '\n' or '\r' */
    while (nchr > 0 && (input[nchr-1] == '\n' || input[nchr-1] == '\r'))
        input[--nchr] = 0;
    ...

删除潜在的行尾字符,然后进行比较。

getline(&input, &len, *stream);
input[strcspn(input, "\r\n")] = 0;
if(strcmp(input, "section1") == 0)
{
    printf("End of section\n");
    found = 1;
}

注意:对于 getline(),缓冲区以 null 结尾并包含换行符(如果找到的话)。明智地检查 getline().

中的 return 值