【问题标题】:Scanf is not scanning %c character but skips the statement, why is that? [duplicate]scanf 不是扫描 %c 字符而是跳过语句,这是为什么呢? [复制]
【发布时间】:2015-12-15 02:15:33
【问题描述】:

我使用 switch case 语句编写了一个程序,并要求输入一个字符,但它没有在控制台窗口中要求字符,而是完全跳过它

int main() 
{
    float a, b, ans;
    char opr;

    printf("\nGIVE THE VALUES OF THE TWO NUMBERS\n");
    scanf(" %f %f",&a,&b);


    printf("\nGIVE THE REQUIRED OPERATOR\n");   

    //no display(echo) on the screen
    //opr = getch();
    //displays on the screen
    //opr = getche();

    scanf("%c",&opr);

    switch(opr)
    {
        case '+' :
            ans = a+b;
            printf("%f", ans);
            break;          
        case '-' :
            ans = a-b;
            printf("%f", ans);
            break;          
        case '*' :
            ans = a*b;
            printf("%f", ans);
            break;          
        case '/' :
            ans = a/b;
            printf("%f", ans);
            break;
        case '%' :
            ans = (int)a % (int)b;
            printf("%f", ans);
            break;
        default :
            printf("\nGIVE A VALID OPRATOR\n");

    }

    system("pause");        
    return 0;

但是当我在第二个scanf 中在%c 之前放置一个空格时,它起作用了,有人在讲述一个我发现令人困惑的空白

他说第二个scanf\n 的值作为一个字符,如果我在第二个%c 之前放一个空格scanf 不是那个字符,它不占用空间作为字符?

但在这个程序中,它没有将\n 作为字符

int main() 
{
    char a;
    printf("\ngive a char\n");
    scanf("%c",&a);
    printf("%c",a);

    return 0;
}  

这真的很令人困惑,任何人都可以帮助我了解问题所在。

【问题讨论】:

  • 这可能是您在插入两个数字后输入的“换行符”字符。输入就像一个缓冲区队列。它排列字符。在这种情况下,您告诉它将第一个数字读入 &a ,跳过中间的任何内容,将第二个数字读入 &b,然后读下一个字符。由于在 &b 中输入数字后,我猜你点击了“ENTER”,所以它会将“换行符”读入 &opr。解决此问题的一种快速方法是添加另一行 'scanf("%c",&opr);'紧接在您的 scanf 操作线之后。
  • 在第二个scanf 中的%c 之前放置一个空格。 stackoverflow.com/questions/13275417/…
  • 不要使用scanfc-faq.com/stdio/scanfprobs.html
  • 空白是任何“空”字符。像空格和制表符。所以scanf(" %c", &opr).
  • @Washington Guedes 如果您使用scanf("%s", a);,请将a 的类型更改为char[2];。另外,scanf("%1s", a);,缓冲溢出风险降低更好。

标签: c char switch-statement scanf dev-c++


【解决方案1】:

每次使用这种格式的 scanf 时:

scanf("%c",&a); 

它留下一个换行符,将在下一次迭代中使用。 您提到的最后一个程序只有一个“scanf”。尝试使用另一个scanf。你会遇到同样的问题。

所以为了避免空格,你必须写:

 scanf(" %c",&opr); 

格式字符串前的空格告诉 scanf 忽略空格。或者更好用

getchar();

它会消耗你所有的换行符

【讨论】:

  • 感谢很好的解释,getche() 和 getchar() 有什么区别
  • 如果你真的想明确你的概念,请点击这个链接:c-lang.thiyagaraaj.com/archive/c-blog/…
  • 我真的会这样做,但它不允许我在问问题之前几分钟才来到网站,它说你必须有 15 岁左右的声誉
  • @psraganvesh : stcakoverflow 没有问题...wlcm !!
  • 谢谢兄弟.....☺
【解决方案2】:

问题是您在未使用的数字之后输入了\n,然后被第二个scanf() 读取。 如果您检查 opr 中的值,您会看到它是 '\n'。

【讨论】:

    【解决方案3】:

    第二个程序确实以\n为字符。
    也许你只是在输入其他字符之前没有输入\n

    example ( %c in printf is changed to %d to make it clear)

    【讨论】:

    • @HaveNoDisplayName 为什么要删除我的引文并将其设为纯文本?
    • 在包含错误之前不需要引用简单的文本,并且代码只需要缩进。
    • 为什么简单地删除不需要的报价似乎不起作用?
    【解决方案4】:

    尝试在 scanf 之前添加 fflush(stdin)。

    【讨论】:

    • fflush(stdin) 将导致未定义的行为,因为stdin 是输入流。
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 2020-08-15
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多