c - while 循环中的两个 scanf 语句无法正确读取

标签 c loops while-loop scanf

第一次发帖。我一直在尝试写一个非常简单的 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?
    }
}

输出:

enter image description here


请注意,您在代码 (scanf("%s\n");) 中所做的是未定义的行为 - %s 需要有效的 char 缓冲区(足够长!),但您没有提供。一般来说,最好避免使用 scanf,因为它的错误处理能力很差。

关于c - while 循环中的两个 scanf 语句无法正确读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33762934/

相关文章:

c - C中char**的动态分配

c - 在同一功能中对一个 fd 进行多次关闭调用是否重要?

c - 如何用表格制作 "global variable"?

c - Arduino:检测 while 循环内按下的按钮

php - 有没有办法避免最后出现空的 else { }?

将 4 字节数字复制到字符数组

java - JSF-c :forEach Not Working On Recursive Method

c++ - 如何在 C++ 中反向迭代 map ?

C - 带指针的 while 循环中的段错误

php - 将 2 个字段组合到一张表中以容纳 43,000 条记录