我试图在C中编写一个简单的程序,它接受一个字符串并根据该输入执行一个动作。但是,如果用户输入了无效字符串,我希望程序再次询问用户输入,直到用户提供有效的输入字符串。
示例输出:
P: Please enter a string.
U: runMarathon
P: Unable to process request, please enter a valid Input:
U: rideBike
P: Unable to process request, please enter a valid Input:
U: sayHello
P: Hello World.
我有一个这样的程序:
int num;
while (scanf("%d",&num) != 1 || num <= 0)
{
printf("Please enter an integer greater than 0\n");
fflush(stdin);
}
这个程序似乎有效;但是我有一位经验丰富的C开发人员告诉我永远不要使用fflush(stdin)。
这是我到目前为止所做的:
int main()
{
char input[];
while (scanf("Please enter a command: %s\n",input))
{
printf("Your command is this: %s\n",input);
}
}
但是在运行此方法时,在接受输入后,程序将不断打印出来:
Your command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: HelloYour command is this: Hello
等等。我很惊讶我找不到任何看似简单问题的资源。我知道我可以使用strcmp比较字符串,但是如何让while循环在再次打印出响应之前等待用户输入?为什么我不能使用fflush(stdin)?
感谢任何意见,谢谢!
答案 0 :(得分:3)
意外输入的问题是scanf
不会从输入缓冲区中删除该输入,因此下次循环迭代它将尝试读取相同的意外输入。
解决此问题的最常见方法是使用例如fgets
,然后在字符串上使用sscanf
。
答案 1 :(得分:1)
为什么我不能使用fflush(stdin)
?
从技术上讲你可以做到但你必须非常小心,因为{C}标准只为输出/更新流而不是输入流定义fflush
,因此fflush(stdin)
的行为是未定义。然后,一些实现可以是例如清除输入缓冲器。如果您真的迫切需要使用它,请参阅您的实现文档和代码。
C-99标准§ 7.19.5.2/2/3 fflush功能
概要
1
#include <stdio.h> int fflush(FILE *stream);
2如果流指向输出流或其中的更新流 最近的操作没有输入,fflush功能导致 要传递给主机的该流的任何未写入数据 要写入文件的环境;否则,行为是 未定义。
3如果stream是空指针,则执行fflush功能 对定义了行为的所有流的此刷新操作 上方。
返回
4 fflush功能设置流的错误指示符 如果发生写入错误则返回EOF,否则返回零。
答案 2 :(得分:0)
你可以这样做:
int main()
{
char input[50];
do
{
printf("Please enter a command:");
if (scanf("%s", &input) != 1) //scanf returns the number of args successfully received
{
printf("Please enter a command\n");
}
printf("Please enter a valid command!\n");
} while (strcmp(input, "good") != 0); //repeat above until input = "good"
//print the good command
printf("Your command is this: %s\n", input);
return 0;
}
有一点需要注意的是,您应该始终确保您正在编写的缓冲区足够大,以容纳放入其中的内容。