第一次发帖。我一直在尝试写一个非常简单的 Knock Knock 笑话。它是这样的:
敲门!敲门!
[用户输入]
香蕉!
[用户输入]
敲门!敲门!
[用户输入]
香蕉!
[用户输入]
...等等等等。 这是一个永无止境的笑话。 我的问题来自 while 循环内的 scanf 语句。如果我在第一个输入中输入“a”,什么也不会发生。如果我然后键入“a”(前面的空格),它会出现 Banana!如果我为 Banana! 输入“a”,它会继续正确地开玩笑。
但是,如果我为 Knock! 输入“whos there”敲!提示它会继续香蕉!正确;但是,如果我为 Banana 输入“banana who”!提示,如果最后说“敲门!敲门!”并立即“香蕉!”不允许输入“Knock!Knock!”提示第二次通过循环。
这是这些输入的图片: Picture
我错过了什么吗?我试过添加 getchar() 语句。我试过 fflush(stdin)。我试过使 scanf 成为一个函数,甚至向该函数添加一个 getchar() 。我已将 scanf("%s") 更改为 scanf("%s\n"),这有所帮助但仍无法正常运行。看起来好像第二个 scanf 试图将空格作为终止字符并从那里继续,但我不知所措。我只想开一个简单的永无止境的 Knock Knock 笑话。
我是傻子吗? 我做错了什么?
这是代码。
#include <stdio.h>
int main(void)
{
while(1)
{
//Begin Joke
printf("Knock! Knock!\n");
scanf(" %s\n"); //Who's there?
//Second Part of Joke
printf("Banana!\n");
scanf(" %s\n"); //Banana who?
}
}
~旋钮
最佳答案
如果您想阅读整行,
%s
不是一个好主意;它通常会在任何空白字符处中断。存在一些肮脏的黑客来规避这一点,但我建议你只使用 fgets
相反:
#include <stdio.h>
#define MAX_LINE_LEN 200
int main(void)
{
char buf[MAX_LINE_LEN];
while (1)
{
//Begin Joke
printf("Knock! Knock!\n");
fgets(buf, sizeof(buf), stdin); //Who's there?
//Second Part of Joke
printf("Banana!\n");
fgets(buf, sizeof(buf), stdin); //Banana who?
}
}
输出:
请注意,您在代码 (scanf("%s\n");
) 中所做的是未定义的行为 - %s
需要有效的 char
缓冲区(足够长!),但您没有提供。一般来说,最好避免使用 scanf
,因为它的错误处理能力很差。
关于c - while 循环中的两个 scanf 语句无法正确读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33762934/