【问题标题】:Simple C scanf does not work? [duplicate]简单的 C scanf 不起作用? [复制]
【发布时间】:2011-04-14 06:32:45
【问题描述】:

如果我尝试以下操作:

int anint;
char achar;

printf("\nEnter any integer:");
scanf("%d", &anint);
printf("\nEnter any character:");
scanf("%c", &achar);
printf("\nHello\n");
printf("\nThe integer entered is %d\n", anint);
printf("\nThe char entered is %c\n", achar);

它允许输入一个整数,然后完全跳过第二个scanf,这真的很奇怪,因为当我交换两者时(首先是char scanf),它工作正常。这到底是怎么回事?

【问题讨论】:

  • 您的指针大小错误,anint 是 char,achar 是 int。不要这样做。
  • @Variable Length Coder:我很抱歉,这是在解释一个更简单的例子,并将两者混为一谈。该错误类型与我的问题无关,已修复示例。

标签: c console scanf


【解决方案1】:

使用scanf读取输入时,按下回车键后会读取输入,但回车键生成的换行符不会被scanf消耗,这意味着下次您从标准读取char输入将有一个换行符可供读取。

避免的一种方法是使用fgets 将输入读取为字符串,然后使用sscanf 提取您想要的内容:

char line[MAX];

printf("\nEnter any integer:");
if( fgets(line,MAX,stdin) && sscanf(line,"%d", &anint)!=1 ) 
   anint=0;

printf("\nEnter any character:");
if( fgets(line,MAX,stdin) && sscanf(line,"%c", &achar)!=1 ) 
   achar=0;

另一种使用换行符的方法是scanf("%c%*c",&anint);%*c 将从缓冲区中读取换行符并将其丢弃。

您可能想阅读以下内容:

C FAQ : Why does everyone say not to use scanf?

【讨论】:

  • 您需要%*c%d 格式之后(也或相反),不是吗?虽然即使这样也不可靠 - 如果用户在数字之后和换行符之前键入空格或其他内容。我认为fgets() + sscanf() 更好。
  • @Jonathan:你是对的。在%d 之后我们需要它。是的,fgets + sscanf 总是更好。
  • @codeaddict:很抱歉长时间接受,但你确实让我对 C 的内部工作方式有了更多的了解。我也非常感谢 C 常见问题解答链接,最好是明智地教新人这些东西,如果我以后能帮助别人的话。
  • /*使用scanf进行int输入后使用scanf进行char输入,只需使用fflush(stdin)函数*/ #include #include void main() { int x ; char y; clrscr(); printf("输入一个整数"); scanf("%d",&x);刷新(标准输入); printf("\n 现在输入一个字符"); scanf("%c",&y); printf("\n X=%d and Y=%c",x,y); getch(); }
【解决方案2】:

其他答案是正确的 - %c 不会跳过空格。最简单的方法是在 %c 之前放置空格:

scanf(" %c", &achar);

(格式字符串中的任何空格都会使scanf消耗所有连续的空格)。

【讨论】:

  • 跳过空格究竟如何有助于丢弃换行符?例如:scanf("\n%c", &achar); 也可以。
  • @cpx:因为换行符是空格。格式字符串中的任何空格都与其他空格一样,因此\n 与空格一样好(但多了一个字母)。
【解决方案3】:

它不会跳过第二个scanf();第二个scanf() 读取第一个scanf() 留下的换行符。大多数格式代码会跳过空格; %c 格式不会跳过空格。

【讨论】:

    【解决方案4】:

    scanf 之前调用getchar() 也会清除存储的换行符。更轻量级但更具情境性

    char input_1;
    char input_2;
    getchar();
    scanf("%c", &input_1);
    getchar();
    scanf("%c", &input_2);
    

    将刷新换行符,在您知道它只是一个排队值而不是字符串的连续代码行中更有用

    【讨论】:

      【解决方案5】:

      在每次 printf 调用后也尝试 _flushall()。 .基本上,默认情况下,MS 的 C++ 缓冲流输出,并且刷新会导致输出流为空。

      【讨论】:

        猜你喜欢
        • 2016-03-07
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        • 2011-09-10
        相关资源
        最近更新 更多