我遇到的问题是,在使用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)
答案 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
。您正在使用getline
和strcmp
来测试该行。使用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;
...