c - 意外调用 printf

标签 c loops

这是我在几周前刚开始学习 C 时发布的第一个关于 C 编程的问题。我会写下我的代码并询问我的问题是什么 :) 如果有人知道我可以如何解决我的错误或我应该替换我的代码的任何内容,请回复:)!

我遇到的问题是,如果您自己运行代码,您会发现一切正常,除了语句中的“else”部分。我遇到的问题是,当有人键入多个字母时,它将多次运行最后一个 printf 语句,并且 printf 的次数与用户输入 y 或 n 以外的字符的次数一样多.

带有 Y 或 N 的第一部分工作正常,但如果他们输入任意数量的其他字符,它不只是说“请再次选择”,一次然后重新扫描,它至少输入 2 个 printfs ,即使输入一个字符,“请再次选择”“请再次选择”,然后,如果您输入更多字符作为答案,它只会输入更多“请再次选择”。

请帮助我理解我做错了什么,因为我非常热衷于学习正确编程,但我只是被困在这里 atm :)

#include <stdio.h>
#include <conio.h>

int main()
{
    char answer;
    int loop = 0;

    printf("Please select. [Y/N]:\n");

    while (loop == 0)
    {
        scanf("%c", &answer);

        if (answer == 'y' || answer == 'Y')
        {
            printf("Seeyou Later Aligator.\n");
            break;
            return 0;
        }
        else if (answer == 'n' || answer == 'N')
        {
            printf("Mmkay.\n");
            break;
            return 0;
        }
        else
        {
            printf("Please select again [Y/N]:\n");
            loop = 0;
        }
    }
    getch();
    return 0;

}

最佳答案

scanf 每次读取所需数量的字符。如果有更多字符,则不会忽略它们。下次调用 scanf 时会读取它们。因此,您会看到每个字符都有多个打印件。为了显式忽略挂起的输入,请在 scanf 之后调用 fflush(stdin)。这意味着清除标准输入流中的所有数据。

更新: fflush 不应如注释中所述用于输入流。使用公认的解决方案来忽略输出。不过,我建议使用 touppertolower 而不是 bit hack。

关于c - 意外调用 printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19508737/

相关文章:

来自并行文件的 Python 元组

c - 迭代 argv[] 会产生段错误

c - 重复调用 C 函数会导致 R - 如何分配内存?

java - 返回字符串 "hi"在给定字符串的任意位置出现的次数

loops - 遍历vlang中的数组

c - 在函数中返回 char*

c - 产生独特的值(value)

c++ - 如何在 C/C++ 中构建自定义的简单 DNS 服务器

c - Microsoft 驱动程序示例中的 DebugTrace

c - 在 c 中使用 libpng 编写正弦波