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