1

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

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

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

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

#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;

}
4

3 回答 3

3

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

更新: fflush如评论中所述,不应在输入流上使用。使用公认的解决方案来忽略输出。但是我建议使用toupperortolower而不是 bit hack。

于 2013-10-22T04:10:31.027 回答
2

许多人指出的原因是您的 scanf 正在读取用户按下后留在输入缓冲区中的额外换行符ENTER。因此,这是一种读取输入以避免整个混乱的替代方法:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {

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

    while (1)
    {

        scanf("%1s%*[^\n]", &answer);
        answer |= 0x20;

        if (answer == 'y')
        {
            puts("Seeyou Later Aligator.");
            break;
        }
        else if (answer == 'n')
        {
            puts("Mmkay.");
            break;
        }
        else
        {
            puts("Please select again [Y/N]:");
        }
    }

    getchar();
    return 0;
}

这将只读取在标准输入上找到的第一个字符并忽略之后的所有内容,同时清除换行符的输入缓冲区

于 2013-10-22T04:15:33.500 回答
1
  1. 休息; 就足够了...... return 永远不会被执行,因为你会打破这个时间
  2. 它打印不止一次,因为 scanf 正在接受 '\n' 和来自先前条目的额外输入
  3. 变量循环在您的代码中也毫无意义

这是固定代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {

    char answer;

    int loop = 0;

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

    while (1)
    {

        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");
            while(getchar()!='\n'){
                getchar();
                if(getchar() == '\n'){
                             break;
                }
            }

        }
    }

    getchar();
    return 0;
}

输出:

$ ./test
Please select. [Y/N]:
dddd
Please select again [Y/N]:
ffffff
Please select again [Y/N]:
y
Seeyou Later Aligator.
于 2013-10-22T04:10:46.480 回答