C - 为什么我得到两个字符而不是一个作为输出?

C - Why am I getting two characters excpet one as output?

所以我创建了这个小程序来代表我的问题。 运行 程序输入 '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)*

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

scanf 之后添加 getchar()

扫描出astdin上有一个\n。抓住角色后调用 getchar() 或将 scanf 更改为 scanf("%c%*c", &o)。因此,您的循环第二次查找输入时,它已经有 \n 等待,它会打开该值,什么都不做,然后再次提示。

键入输入并点击 'Enter' 后,'\n' 将存储在输入缓冲区中,下一个 scanf 将'\n' 作为输入。因此,您首先需要摆脱换行符。这可以通过使用另一个变量(下面代码中的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;
    }
}
}

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

要跳过白色space 个字符,请使用

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