c - 关于比较文件上的字符串的考试练习

标签 c string file compare

我正在尝试为明天的考试做这个练习。

我需要比较自己输入的字符串,看看该字符串是否出现在文件中。这需要直接在文件上完成,所以我无法将字符串提取到我的程序中并“间接”比较它们。

我找到了这种方法,但我做错了,我也不知道为什么。该算法对我来说听起来不错。

有什么帮助吗?我真的需要专注于此。

提前致谢,伙计们。

#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;
        }
    }
}

最佳答案

您在匹配第一个字符后的逻辑看起来很可疑。无需在文件中查找,您需要阅读更多内容以尝试匹配 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 写入 src。写入任何多于 50 的内容都会超出为 src 分配的内存,并产生未定义的后果。你应该把它改成

char src[50];
fgets(src, sizeof(src), stdin);

关于c - 关于比较文件上的字符串的考试练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17348274/

相关文章:

c - 多次包含头文件

c - 签名的字符是什么意思?

java - 使用java在文件中搜索unicode字符串

c++ - 可靠地将字符串转换为 double 并返回

c++ - C - 读取文件并计算行数和列数

c - 放置错误或警告消息(外部变量)

C程序自动关闭

c - queue.h库中struct的使用

Java 文件夹的相对路径,不适用于文件

javascript - 如何使用 JavaScript 或 HTML 将文件输入设置为空?