【问题标题】:Find a word in a file?在文件中查找单词?
【发布时间】:2014-02-08 22:47:10
【问题描述】:

如何在文件中搜索字符串?我想一次扫描一个单词并将其与 *string 进行比较,我该怎么做?

bool searchMatch(char *string, FILE *file){

    while(true){
        char *buff=fgets(buff, 1024,file); //how to get one word at a time???
        printf("BUFF=%s\n",buff);
        if(buff == NULL) break;
        if(strcmp(buff, string) == 0) return true;
    }
    return false;

}

【问题讨论】:

  • 请注意,bool 和 true 和 false 本身在纯 C 语言中均无效。确保您实际上是在使用 C++ 编程,或者具有适当的#include 或设置#define 的。
  • bool、true 和 false 如果包含 <stdbool.h>,则在 C99 中有效。
  • 如果你想一次处理一个令牌,你应该考虑使用strtok或strtok_r

标签: c string file


【解决方案1】:

C 的 stdio 例程不知道“单词”是什么。最接近的方法是使用fscanf() 读取由空格分隔的字符序列:

int searchMatch(char *string, FILE *file) {
    char buff[1024];
    while (fscanf(file, "%1023s", buff) == 1) {
        printf("BUFF=%s\n",buff);
        if (strcmp(buff, string) == 0) return 1;
    }
    return 0;
}

这可能会也可能不会满足您对单词的定义。请注意,“Example test123”之类的内容被解释为两个词:“Example”和“test123”。

此外,您的原始代码永远不会工作,因为您没有为buff 分配空间。 fgets() 不会为您分配内存,buff 必须是指向有效分配内存块的指针。

请注意,循环条件已更改,因此当没有更多可用输入时它会隐式停止 - 通常让循环在条件为假时停止是一个好习惯,而不是在其中分散一堆 break 指令身体。

【讨论】:

  • 你能解释一下1024这个数字吗??
  • @GavinZ。这是缓冲区的大小。此缓冲区中最多可存储 1024 个字符(包括空终止符),这意味着您的字数限制为 1023 个字符。它可以是任何你想要的,只要你更新fscanf() 中的格式说明符。如果您阅读的单词超过 1023 个字符,它将被截断。如果您不想在fscanf() 的格式说明符中硬编码此值,请参阅stackoverflow.com/questions/1621394/… 了解可能的解决方法。
  • 此过程将不起作用。假设您要查找的单词是abc(3 个字符),它占用偏移量 1023、1024 和 1025。以这种方式一次扫描 1024 个字节(或任何有限的数量)将无法在不修改的情况下工作。
  • @Brandin 是的,它会的。如果你不相信它,你可以测试它。它不是一次读取 1024 个字节。它正在读取由空格分隔的字符块,最多 1023 个字符。单词abc 读作abc,只要它与其他字符之间用空格隔开。下一次,您可能想在投票之前测试代码或阅读手册页,这样您就可以避免一些尴尬。
  • @FilipeGonçalves 如果您想将 wrt 处理为空白,您可能应该使用 strtok 或 strtok_r。为什么子字符串搜索必须包含空格?将abc 放在没有空格的文件的缓冲区边界处,并尝试使用此方法找到它。它只是行不通。
【解决方案2】:

尝试使用strstr()函数,它不会逐字比较,但它可以帮助你告诉你string是否在buff中 示例:

      If(strstr(buff, string)) return 0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多