【发布时间】:2019-07-17 18:24:22
【问题描述】:
我正在尝试在文件中查找字符串。我通过修改 getline 手册页中的代码 sn-p 编写了以下内容。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
FILE * fp;
char * line = NULL;
char *fixed_str = "testline4";
size_t len = 0;
ssize_t read;
fp = fopen("test.txt", "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&line, &len, fp)) != -1) {
printf("Retrieved line of length %zu:\n", read);
printf("%s", line);
if (strcmp(fixed_str,line)==0)
printf("the match is found\n");
}
//printf("the len of string is %zu\n", strlen(fixed_str));
fclose(fp);
if (line)
free(line);
exit(EXIT_SUCCESS);
}
问题是 strcmp 的结果总是错误的,尽管 getline 成功且正确地迭代了文件中的所有行。
由于换行符,fixed_str 的长度为 9,文件中相等字符串的长度为 10(我对吗?)。但是在strncmp 的帮助下比较 9 个字符仍然会产生错误的结果。我也排除了大写和空格的可能性,所以我认为我做错了什么
test.txt如下
test line1
test line2
test line3
testline4
string1
string2
string3
first name
我尝试了所有条目但没有成功
注意:在我的实际程序中,我必须从另一个文件中读取fixed_str
【问题讨论】:
-
if (strcmp(fixed_str,line))==0)- 这无法编译。有两个(s 和三个)s。 -
向我们展示您的
strncmp尝试。 -
如果您更正@EugeneSh。推荐并使用 strncmp 它应该可以工作
-
@incompetent 将
printf("%s", line);替换为printf("<%s>", line);并仔细查看输出。还向我们展示一个最小的test.txt文件,它可以重现问题- -
哇哦... “在我的实际程序中...” - 好的,但是 this 代码是否存在同样的问题?您读取输入的方式可能会完全根据输入法的语义改变结果。您的 实际 代码可能完全表现出不同的问题 - 只是具有相同的可观察症状。您至少应该发布一个片段,显示您如何接受输入以及输入文件包含的内容 - 或者更好的是,只讨论这段代码,如果解决方案不适用于“真实”代码,则发布一个不同的问题。