如何搜索单词在文本文件中出现的次数

时间:2016-11-06 13:12:37

标签: c string io strcmp

我试图编写一个程序,我必须从键盘输入一个单词,然后它将使用strcmp()函数检查文本文件中出现的次数。这是我的代码。我可以写单词但是当我进入输入按钮时程序停止。任何人都可以帮我弄清楚什么是错的?

#include "stdafx.h"
#include <string.h>
#include <stdio.h>


int main()
{
char input[20];
char string[20];
int num = 0;


FILE *text;

printf("Enter a word:\n");
scanf_s("%s\n", &input);

fopen_s(&text, "C:\\Users\\USER\\Documents\\Visual Studio 2015\\Projects\\ConsoleApplication8\\text.txt", "r");

if (text == NULL) {
    printf("Failed to open file\n");
    return (-1);
}

while (!feof(text))
{
    fscanf_s(text, "%s", string);
    if (!strcmp(string, input));
    num++;
}

printf("we found the word %d times\n", num);

return 0;
}`

2 个答案:

答案 0 :(得分:1)

[从这"C:\\Users\\USER\\Documents\\Visual Studio 2015\\ ...我得出结论,使用的编译器是MS-VC]

除了MarianD this answer 所指出的feof()错误使用外,还有以下 致命 > 错误:

这一行错过了要扫描的缓冲区大小:

  fscanf_s(text, "%s", string);

应该是

  fscanf_s(text, "%s", string, (unsigned) sizeof string);

相同加1问题:

  scanf_s("%s\n", &input)
  1. 通过input,而不是其地址。 %s期望char*input衰变)。执行&input实际上会传递相同的值,但使用错误的类型,即char(*)[20],它将调用UB。
  2. 传递其大小:

    scanf_s("%s\n", input, (unsigned) sizeof input)
    
  3. 来自fscanf_s documentation

      

    更安全的函数(具有_s后缀)和其他版本之间的主要区别在于更安全的函数需要每个c,C,s,S和[type字段]的字符大小作为紧跟变量的参数。

         

    [...]

         

    size参数的类型为unsigned,而不是size_t

答案 1 :(得分:0)

变化

scanf_s("%s\n", &input); 

通过

scanf_s("%s\n", input);

确实输入已经是char *而你发送的是char (*)[20]