C语言scanf与printf?

代码如下 运行环境 VS2013
问题:输入1a 输出a=1 (这个没问题)而ch却什么都没得到。为什么?ch不应是a吗?

 #include<stdio.h>
#include<stdlib.h>
int main()
{
    int a;
    char ch;

    scanf_s("%d", &a);
    printf("a=%d\n",a);

    scanf_s("%c", &ch);
    printf("ch=%c\n",ch);
    system("pause");
    return 0;
}

运行结果附图如下:
图片说明

个人比较认可 VS 的情况
一次输入回车换行,算是本次输入的结束,而不应该响应后续的数据输入与处理。

当然,各个编译器的处理确实不同。因为你的输入都被获取到了,只是看如何处理。

把代码在dev c++下编译结果如下。是编译器的问题吗?图片说明

输入输出缓冲区处理。。。

输入1 按回车显示a=1;在输入a,回车显示ch=a。
另一个解决方法是 scanf_s("%d,%c", &a,&ch); printf("a=%d,ch=%c\n",a,ch);

同意91program的说法

行缓冲,只有按了回车之后,才算一次输入结束,按照类型从第一个字节开始取,多于的丢弃

输入缓冲的缘故, 输入之后按回车算做一次输入的完成,之后再进行所需要的输入

输入缓冲的缘故, 输入之后按回车算做一次输入的完成,之后再进行所需要的输入

几种可能性
1)VS把a吞掉了,相同的代码在gcc下行为就不一样;
2)printf的存在影响后续的scanf的行为,看看去掉printf有没有区别。

可以使用非标准的'%n",看看scanf到底扫描了几个字符。(不知道VS是否支持)

   n      Nothing  is expected; instead, the number of characters consumed thus far from the input
          is stored through the next pointer, which must be a pointer to int.

你在第二次scanf前加一下代码试试:
scanf("%*[^\n]");
scanf("%*c");
功能是清理输入缓冲区。

肯定不会显示a,因为缓存已清空

中间要放空格的,不然回车也算一个字符

你的 ch 不是没有获取值,而是得到了 换行符'\n',你在输入ch字符的scanf 前,调用一下 in.ignore() 就OK了。

DEV-C和VS2010输入1a都可以如题主所愿,
应该输入一次按一次回车比较好,
不过应该这样实现。

    scanf_s("%d", &a);  
    printf("a=%d\n",a); // \n 留在缓冲区
    getchar();                // 回显消去\n
    scanf_s("%c", &ch);
    printf("ch=%c\n",ch);

建议你用DEV C++ 因为塔比较轻量级,但是VS就很大,显得很笨重;当然各有各的优势,比如再观察继承父类子类
之间的祈构函数时候,VC就可以查看到,但是VS测试代码就显示不了。。所以每个编译器都有一定区别
这个问题加一个 空格,或者getChar()吸收一下多余的回车会好一些

VS对这两个函数的处理比较特别,只有按了回车之后才使输入结束,所以会发生这种情况。

中间要放空格的,不然回车也算一个字符