我试图编写一个程序,我必须从键盘输入一个单词,然后它将使用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;
}`
答案 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)
input
,而不是其地址。 %s
期望char*
(input
衰变)。执行&input
实际上会传递相同的值,但使用错误的类型,即char(*)[20]
,它将调用UB。传递其大小:
scanf_s("%s\n", input, (unsigned) sizeof input)
更安全的函数(具有_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]
。