【问题标题】:Problems with scanfscanf 的问题
【发布时间】:2013-11-22 07:30:36
【问题描述】:
#include <stdio.h>

int main()
{

    char C, B;
    int x;



    printf("What comes after G\n");
    scanf("%c", &C);

    printf("What comes after O\n");
    scanf("%c", &B);

    printf("What is your age?\n");
    scanf("%d", &x);

    printf("You said %c comes after G, %c after T and you're %d years old? Right?", C, B, x);

    return 0;
}

问题是每当您运行代码时,它都会跳过第二个问题“O 之后是什么”,然后询问“您的年龄是多少?”

我可以避免程序跳过第二个问题的唯一方法是在代码中添加一个空格

printf("What comes after O\n");
    scanf(" %c", &B);

您可以看到 "%c

之间的 空格

你能给我解释一下吗?

【问题讨论】:

标签: c scanf


【解决方案1】:

您需要吃掉空白(即新行) - 根据手册页 http://linux.die.net/man/3/scanf

【讨论】:

    【解决方案2】:

    问题是您正在使用 scanf 来获取字符 ..并且将在 user 的每个输入的末尾添加一个新行。所以第二次只有新行将存储在'B'中因为你给出的第一个输入..

    而不是 scanf ,将其更改为 getchar - 你的问题应该得到解决

    【讨论】:

    • getchar 也会在您按下回车时在输入中附加额外的\n
    • 使用getchar 代替scanf 不会解决这个问题。
    【解决方案3】:

    您可以使用scanf 吃掉单个字符,而无需将其分配给这样的任何东西::

    scanf( "%[^\n]%*c", &C ) ;
    

    %[^\n] 告诉scanf 读取不是'\n' 的每个字符。这会将'\n' 字符留在输入缓冲区中,然后* (assignment suppression) 将使用单个字符('\n'),但不会将其分配给任何内容。

    【讨论】:

      【解决方案4】:

      这个问题的原因是换行符\n在按Enter后被前一个scanf留下。此\n 留待下次调用scanf
      为避免此问题,您需要在 scanf 中的 %c 说明符之前放置一个空格。

      scanf(" %c", &C);  
      ...
      scanf(" %c", &B);
      ...
      scanf(" %c", &X);  
      

      %c 之前的空格可以占用任意数量的换行符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        • 2011-07-21
        • 2012-12-28
        • 2011-05-20
        • 1970-01-01
        相关资源
        最近更新 更多