C - 为什么我得到两个字符,除了一个作为输出?

时间:2015-02-27 00:45:50

标签: c switch-statement printf

所以我创建了这个小程序来代表我的问题。运行程序输入'a'按ENTER键。

C代码:

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

int main(void)
{
    char o;
    while(1)
    {
        printf("> ");
        scanf("%c",&o);
        switch(o)
        {
        case 'a' :
            printf("%c\n",o);
            break;
        case 'q' :
            return 0;
        }
    }
}

输出是:

> a
a
> > *(waiting for input)*

我的预期是:

> a
a
> *(waiting for input)*

请给我一些建议如何解决我的问题。谢谢。

4 个答案:

答案 0 :(得分:3)

扫描\n后,stdin上有a。在抓取角色或将getchar()更改为scanf后,请致电scanf("%c%*c", &o)。因此,第二次循环查找输入时,它已经等待\n,它将打开该值,不执行任何操作,然后再次提示。

答案 1 :(得分:1)

scanf("%c",&o);将只读取一个字符,而不会跳过空格。换句话说,它会将换行符,制表符和空格字符视为有效输入。

要跳过空格字符,请使用

scanf(" %c",&o); 
       ^---- note the extra space here

答案 2 :(得分:0)

getchar()之后添加scanf

答案 3 :(得分:0)

输入输入并点击“输入”后,&#39; \ n&#39;存储在输入缓冲区中,下一个scanf需要&#39; \ n&#39;作为输入。因此,您首先需要摆脱换行符。这可以通过使用另一个变量(下面的代码中的clr)来存储换行符来实现。以下是修改:

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

int main(void)
{
char o,clr;    
while(1)
{
    printf("> ");
    scanf("%c",&o);
    clr=getchar();    // line added
    switch(o)
    {
    case 'a' :
        printf("%c\n",o);
        break;
    case 'q' :
        return 0;
    }
}
}