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
。您正在使用 getline
和 strcmp
来测试线路。使用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 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;
...
删除潜在的行尾字符,然后进行比较。
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 值
我遇到一个问题,在使用 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
。您正在使用 getline
和 strcmp
来测试线路。使用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 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;
...
删除潜在的行尾字符,然后进行比较。
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()
.