黑马程序员技术交流社区

标题: 关于C语言(scanf())的一个小小的问题 [打印本页]

作者: 何仕映    时间: 2014-5-1 19:38
标题: 关于C语言(scanf())的一个小小的问题
本帖最后由 何仕映 于 2014-5-1 20:18 编辑

复制代码
  1. #include<stdio.h>

  2. int main(void)
  3. {

  4.         int a;

  5.         scanf("%d",&a);
  6.         printf("%d\n",a);

  7.         int b;
  8.         scanf("%d",&b);


  9.         printf("%d   %d\n",a,b);

  10.         return 0;
  11. }
复制代码







在以上代码为什么可以在第一次输入时可以这样,直接输入一个1,空格 然后输入 5。按照这个程序,是在打印第一个数字以后,才定义的整形变量b。应该是先输入一个数字,打印这个数字之后再输入第二个数字啊。为什么在第一次输入时就可以输入两个数字呢?请各位大神指点迷津啊。

作者: 魅影穿眸    时间: 2014-5-1 20:11
scanf("%d",&a);
printf("%d\n",a);输出a

printf("%d   %d\n",a,b);输出a b
作者: m573555543    时间: 2014-5-1 20:12
file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\316625387\QQ\WinTemp\RichOle\8_0M325D8UA(OTA`@PHUKBK.jpg可以第二次打印




作者: 何仕映    时间: 2014-5-1 20:19
m573555543 发表于 2014-5-1 20:12
可以第二次打印

我是想问为什么可以在第一次输入时就可以输入两个数字进行赋值。
作者: NenKeer    时间: 2014-5-1 20:21
本帖最后由 NenKeer 于 2014-5-1 20:23 编辑

实际上scanf()函数接收输入,并不是直接从键盘接收,而是动过输入流来接收数据,我们从键盘打的字符,都先被存在流中,如果流里面有东西,scanf()就会从里面取东西,而不需要在输入。
  1.     #include<stdio.h>

  2.     int main(void)
  3.     {

  4.             int a;

  5.             scanf("%d",&a);                   //输入“1space5enter”,遇到中间的space,第一个scanf函数结束,流内剩下5enter
  6.             printf("%d\n",a);

  7.             fflush(stdin);                   //解决这个问题的方法,可以加入调用这个函数,清空输入流的缓冲区,下一个scanf函数就需要键盘重新输入了

  8.                         int b;
  9.             scanf("%d",&b);                  //如果不调用fflush函数,由于流内还有5enter,所以直接从流内读入,遇到enter,这个scnaf函数结束


  10.             printf("%d   %d\n",a,b);

  11.             return 0;
  12.     }
复制代码

作者: 执着的土豆    时间: 2014-5-1 20:29
可能和缓冲区还是和编译器有关系, 应该是先输入,输入的时候会一个一个来,有几个就输入几个,存入缓冲区。读取的时候,读几个再从缓冲区,拿出来几个。这和编译器的处理和编译方式有关吧,这属于编译原理方面的东西。   你可以试试,如果你输入1空格2空格3回车,你会发现,他不会读取后面的3,只会读取1和2。
作者: machao610    时间: 2014-5-11 23:17
scanf()是在输入缓冲区内取,所以你输入几个数都可以,只是输出时才会根据常量的类型取值。
作者: UT丶    时间: 2014-5-12 15:33
我明白了0 0




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2