C 关于比较文件中字符串的考试练习
我正在做这个练习,准备明天考试C 关于比较文件中字符串的考试练习,c,string,file,compare,C,String,File,Compare,我正在做这个练习,准备明天考试 我需要比较我自己输入的字符串,看看该字符串是否出现在文件中。这需要直接在文件上完成,因此我无法将字符串提取到程序中并“间接”比较它们 我找到了这条路,但我没有弄对,我不知道为什么。这个算法听起来不错 需要帮忙吗?我真的需要关注这一点 先谢谢你们,伙计们 #include<stdio.h> void comp(); int main(void) { comp(); return 0; } void comp() { FIL
我需要比较我自己输入的字符串,看看该字符串是否出现在文件中。这需要直接在文件上完成,因此我无法将字符串提取到程序中并“间接”比较它们 我找到了这条路,但我没有弄对,我不知道为什么。这个算法听起来不错 需要帮忙吗?我真的需要关注这一点 先谢谢你们,伙计们
#include<stdio.h>
void comp();
int main(void)
{
comp();
return 0;
}
void comp()
{
FILE *file = fopen("e1.txt", "r+");
if(!file)
{
printf("Not possible to open the file");
return;
}
char src[50], ch;
short i, len;
fprintf(stdout, "What are you looking for? \nwrite: ");
fgets(src, 200, stdin);
len = strlen(src);
while((ch = fgetc(file)) != EOF)
{
i = 0;
while(ch == src[i])
{
if(i <= len)
{
printf("%c - %c", ch, src[i]);
fseek(file, 0, SEEK_CUR + 1);
i++;
}
else break;
}
}
}
#包括
无效comp();
内部主(空)
{
comp();
返回0;
}
无效薪酬()
{
FILE*FILE=fopen(“e1.txt”、“r+”);
如果(!文件)
{
printf(“无法打开文件”);
返回;
}
char-src[50],ch;
短i,len;
fprintf(stdout,“你在找什么?\n写:”);
fgets(src,200,标准DIN);
len=strlen(src);
而((ch=fgetc(文件))!=EOF)
{
i=0;
while(ch==src[i])
{
如果(i匹配第一个字符后的逻辑看起来可疑。无需在文件中查找,您需要读取更多内容以尝试匹配src
中的后续字节,并且在每次迭代中重置i
会阻止您检查src
中的后续字符
以下(未测试)代码应更接近标记
i = 0;
while((ch = fgetc(file)) != EOF) {
if (ch != src[i]) {
i = 0;
}
else if (++i >= len) {
printf("found %s in file\n", src);
break;
}
}
它依赖于对fgetc
的重复调用,而不是fseek
,并且仅在字符不匹配时将索引重置为src
还请注意
char src[50];
fgets(src, 200, stdin);
稍有错误。它告诉fgets
,它最多可以将200个char
s写入src
。写入超过50个字符将超出为src
分配的内存,其后果未定义。您应该将此更改为
char src[50];
fgets(src, sizeof(src), stdin);
“这需要直接在文件上完成,因此我无法将字符串提取到我的程序中并“间接”比较它们。”这正是你正在做的。你认为fgetc做什么?它将字符加载到你的程序中…我的意思是我不能在我的程序中将文件放入字符串中。对不起,我没有解释我自己。你可以将文件中的数据读取到缓冲区中,而无需NUL终止它,因此它不会是字符串。然后使用memcmp()
。给出的答案解决了您的主要问题,但它们仍然无法找到字符串“aaab”中的字符串“aab”。因为在遇到第三个“a”后,它们会将i重置为0,“忘记”已经遇到2个“a”。底线是,您需要某种类型的堆栈。我已经用fseek()编辑了simonc的答案考虑到Taylor的评论(不是最优雅的解决方案,而是一个简单的解决方案)。我希望它在同行评审Minor point后不久可见,但您现在应该在循环外初始化I=0
。如果OP将更新的循环粘贴到他的代码中,则ch!=compare[I]的第一个测试
将为i
使用未初始化的值,可能会崩溃。您完全正确:这是我建议在重置i=0
之前直接进行的编辑:如果(i>0){fseek(file,i*-1,SEEK_CUR);}
。因此,如果您搜索“ab”并且有“aab”,您将检查第二个“a”两次,您将有一个匹配项。
char src[50];
fgets(src, sizeof(src), stdin);