C - getline()和strcmp()问题

时间:2015-04-01 18:05:01

标签: c getline strcmp

我遇到的问题是,在使用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()永远不会返回0。任何见解将不胜感激!

对代码进行了编辑。我错误地转移了它。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

注意:对于getline(),缓冲区以空值终止,并包含换行符(如果找到)。明智地检查getline()的返回值。

答案 1 :(得分:1)

在这种情况下,您不需要使用feof。您正在使用getlinestrcmp来测试该行。使用getline的返回来测试是否继续阅读。正确的实现类似于:

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使这很简单,因为它返回实际读取的字符数 - 无需调用strlen。只需捕获变量中getline的返回值,如果使用DOS行结束,则删除newline(或同时carriage return& newline,如下所示:

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;
    ...