20

我正在学习 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. 选项 2。
  3. 选项 3。
  4. 出口。

做一个选项:1

您选择了选项 1。

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

按任意键继续。

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

4

10 回答 10

23

您的 scanf 只吃掉了数字,但没有吃掉尾随的换行符。在 %d 之后放置一个换行符或空格会给你带来相反的问题,读得太远。

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

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

于 2009-09-08T01:36:09.517 回答
8

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

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

问题是尾随换行符没有被“%d”转换说明符使用,所以它被getchar(). 没有一种最好的方法来处理这个问题,但通常方法是将整行作为文本读取(使用fgets()scanf()使用大小为“%s”的转换说明符),这将消耗换行符,然后转换为目标数据类型使用sscanf()strtol()strtod()

于 2009-09-08T03:50:52.503 回答
3

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

于 2009-09-08T01:36:04.493 回答
2

我想你在输入“1”后输入了一个回车。它将被 . 接受。因此,您只需在原始问题之后(就在 之前)getchar()添加一个附加内容即可解决问题。getchar()return 0;

** 我对此进行了测试并且它有效。

于 2009-09-08T01:44:49.437 回答
2

getchar() 正在从 scanf 中的键盘读取 \n - 请参阅此处了解更多信息

于 2009-09-08T01:37:36.440 回答
2

如前所述, scanf 在读取用户输入后会留下 \n 。

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

这弥补了 scanf 的不足。

IE

int value; 
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
scanf("%d", &value);
getchar();
switch (value) 
于 2013-02-13T13:11:03.727 回答
2

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

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

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

于 2011-12-13T00:44:30.783 回答
0

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

希望它有效:D

于 2018-10-18T20:07:46.167 回答
-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(); 
} 
于 2010-02-17T05:28:38.537 回答
-10

为了让您的程序正常工作,您应该在调用 getchar() 之前“刷新”输入流并调用 fflush(stdin)。这样做的目的是,当您在键盘上输入一个数字然后按回车键时,输入缓冲区会同时获取两个字符,例如“1”和“\n”,而您对 scanf 的调用只会得到“1”,因此“ \n' 保留在输入缓冲区中。当你调用 getchar 时,你正在“gettin”剩下的 '\n'。刷新输入会丢弃所有缓冲区。

于 2009-09-08T01:36:48.377 回答