为什么getchar()不等我在scanf()后按Enter键?

16 c getchar

我正在学习C,我正在使用"getchar()"来停止命令窗口,所以我可以看到练习正在进行,但它只是不起作用.下面是一个样本:

#include <stdio.h>

int main()
{
    int value;
    printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: ");
    scanf("%d", &value);
    switch (value)
    {
        case 1:
            printf("you selected the option 1.");
            break;
        case 2:
            printf("you selected the option 2.");
            break;
        case 3:
            printf("you selected the option 3.");
            break;
        case 4:
            printf("goodbye");
            break;
        default:
            printf("thats not an option");
            break;
    }
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

  1. 选项1.
  2. 选项2.
  3. 选项3.
  4. 出口.

做出选择:1

您选择了选项1.

进程返回0(0x0)执行时间:3.453秒

按任意键继续.

为什么不等待"getchar()"的输入?

Dig*_*oss 22

您的scanf只吃数字而不是尾随换行符.在%d之后添加换行符或空格会给你带来相反的问题,读得太远了.

这就是人们不喜欢scanf的原因.

我建议读一个实际的行(使用fgets(3))然后sscanf()用来扫描字符串.


Joh*_*ode 8

首先,千万不能使用fflush()来清除输入流; 行为未定义:

7.19.5.2.2如果流指向未输入最近操作的输出流或更新流,则fflush功能会将该流的任何未写入数据传送到主机环境以写入该文件; 否则,行为未定义.

问题是"%d"转换说明符没有使用尾随换行符,因此它会立即被拾取getchar().没有一种最好的方法可以解决这个问题,但通常的方法是将整行读取为文本(使用fgets()scanf()使用大小的"%s"转换说明符),这将使用换行符,然后转换为目标数据类型使用sscanf()strtol()strtod().


Joh*_*ood 3

getchar 可以获取您在 1 之后输入的回车吗?

  • 但这是未定义的行为,可能不可移植,尤其不推荐用于家庭作业式的学习体验。遵循已发布且标准化的 API!:-) (2认同)