这丫的就是胡扯!
首先你应该这样改:
if (scanf("%d", (int*)(array + i)) != 1)
然后你输入1.2是一个浮点类型
当你输入后,程序会从输入缓冲区中取数据:
取数据的依据是你输入的要求。。你要求%d,它就从缓冲区从左到右取(根据贪吃算法,尽可能多的向后去符合条件的)
先取出一个1,然后发现一个“.”不是整形的,就返回
返回scanf的返回值也是1,因为读入一个1
然后指针指向"."的下标,当第二次取得时候,发现是“.”不符合要求,因此没取到数据。
scanf就返回0
而且你可以试一下,你如果第二次%c的话就可以取出“.”符号
就缓冲区这一块问题比较多,这只是其中的一点
用C++的流控制就好多了
这个程序你输入1.2结果a是1,b是“.”
而且如果你这样的话:
原理和前面的一样,你取出1,后面的数字因为“.”不是整型而被阻断
而且局部变量没有覆盖a赋值,因此相当于每次scanf返回0,没有取到值,a的值也就没变,因此都是1
[ 本帖最后由 liufashuai 于 2013-8-22 23:44 编辑 ]
首先你应该这样改:
if (scanf("%d", (int*)(array + i)) != 1)
然后你输入1.2是一个浮点类型
当你输入后,程序会从输入缓冲区中取数据:
取数据的依据是你输入的要求。。你要求%d,它就从缓冲区从左到右取(根据贪吃算法,尽可能多的向后去符合条件的)
先取出一个1,然后发现一个“.”不是整形的,就返回
返回scanf的返回值也是1,因为读入一个1
然后指针指向"."的下标,当第二次取得时候,发现是“.”不符合要求,因此没取到数据。
scanf就返回0
而且你可以试一下,你如果第二次%c的话就可以取出“.”符号
就缓冲区这一块问题比较多,这只是其中的一点
用C++的流控制就好多了
#include <stdio.h>
int main()
{
int a;
char b;
scanf("%d",&a);
scanf("%c",&b);
printf("%d %c\n",a,b);
return 0;
}
int main()
{
int a;
char b;
scanf("%d",&a);
scanf("%c",&b);
printf("%d %c\n",a,b);
return 0;
}
这个程序你输入1.2结果a是1,b是“.”
而且如果你这样的话:
#include <stdio.h>
int main()
{
int a;
while(1)
{
scanf("%d",&a);
printf("%d\n",a);
}
return 0;
}
当你输入1.2的时候会进入死循环结果输出都是1int main()
{
int a;
while(1)
{
scanf("%d",&a);
printf("%d\n",a);
}
return 0;
}
原理和前面的一样,你取出1,后面的数字因为“.”不是整型而被阻断
而且局部变量没有覆盖a赋值,因此相当于每次scanf返回0,没有取到值,a的值也就没变,因此都是1
[ 本帖最后由 liufashuai 于 2013-8-22 23:44 编辑 ]
有一种落差是,你配不上自己的野心,也辜负了所受的苦难。