r4bbit
2015-06-03 22:54
采纳率: 45.8%
浏览 2.8k
已采纳

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;
}

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

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

17条回答 默认 最新

  • 91program 2015-06-03 23:24
    已采纳

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

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

    打赏 评论
  • r4bbit 2015-06-03 22:59

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

    打赏 评论
  • N3verL4nd 2015-06-04 00:14

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

    打赏 评论
  • 岳麓小胜 2015-06-04 00:44

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

    打赏 评论
  • m1181324794t 2015-06-04 01:31

    同意91program的说法

    打赏 评论
  • Arnold9009 2015-06-04 01:52

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

    打赏 评论
  • 赫夫曼树 2015-06-04 02:51

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

    打赏 评论
  • 赫夫曼树 2015-06-04 02:51

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

    打赏 评论
  • nswcfd 2015-06-04 02:59

    几种可能性
    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.
    
    打赏 评论
  • jjjjjjjjjhhhhhh 2015-06-04 05:10

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

    打赏 评论
  • VisionZQ 2015-06-04 13:48

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

    打赏 评论
  • zhucebuzhou10 2015-06-04 13:58

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

    打赏 评论
  • 零度永恒 2015-06-05 14:57

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

    打赏 评论
  • fzusummer 2015-06-05 16:10

    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);
    
    
    打赏 评论
  • 另一花生 2015-06-05 16:25

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

    打赏 评论
  • fcxxxer 2015-06-08 16:39

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

    打赏 评论
  • 请叫我头头哥 2015-06-18 02:51

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

    打赏 评论

相关推荐 更多相似问题