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

时间:2009-09-08 01:30:15

标签: 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;
}

这是输出:

  
      
  1. 选项1。
  2.   
  3. 选项2。
  4.   
  5. 选项3。
  6.   
  7. 退出。
  8.         

    选择:1

         

    您选择了选项1。

         

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

         

    按任意键继续。

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

10 个答案:

答案 0 :(得分:22)

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

这就是为什么人们不喜欢scanf。

我建议您阅读实际行(使用fgets(3)),然后使用sscanf()扫描字符串。

答案 1 :(得分:8)

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

  

7.19.5.2.2如果流指向输出流或最新的流更新流     如果没有输入操作,fflush函数会导致该流的任何未写入数据     要传递到主机环境以写入文件;否则,行为是     未定义。

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

答案 2 :(得分:3)

getchar可以获得你在1之后输入的回车吗?

答案 3 :(得分:2)

getchar()正在scanf中从键盘读取\ n - 有关详细信息,请参阅here

答案 4 :(得分:2)

我认为你在输入“1”后输入了一个输入。它将被getchar()接受。因此,只需在原始版本之后添加getchar()(在return 0;之前)即可解决问题。

**我测试过这个并且有效。

答案 5 :(得分:2)

你得到一个回车,我绕过它的方式,定义一个字符,然后让它扫描回车,

char ch; (在你的getch()之前输入以下内容) scanf("%c",&ch); getchar();

应该以这种方式工作,而不是最有效的方式,但对我有用。

答案 6 :(得分:1)

如上所述,scanf在读取用户输入后离开\ n

Soultion:在scanf之后直接添加getchar()。

补偿了scanf缺陷。

int value; 
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
scanf("%d", &value);
getchar();
switch (value) 

答案 7 :(得分:0)

在阅读其他答案时,我发现您可以使用scanf("%d\n",&n); 而不是scanf("%d",&n);从缓冲区中删除新行。我还没有检查出来。

希望它有效:D

答案 8 :(得分:-2)

#include <stdio.h> 
#include<conio.h>
void 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; 
    } 
    getch(); 
} 

答案 9 :(得分:-9)

为了让你的程序工作,你应该在调用getchar()并调用fflush(stdin)之前“刷新”你的输入流。这样做的是,当你键入一个数字然后键入返回键时,输入缓冲区会获得两个字符,例如'1'和'\ n',而你对scanf的调用只获得'1'所以' \ n'保留在输入缓冲区中。当你打电话给getchar时,你仍然会“保持”'\ n'。刷新输入会丢弃所有缓冲区。