c语言的 输入数字 数组的问题

下面是我的代码
#include<stdio.h>
void main()
{
int a[80],k=0;
char c;
printf("请输入数字空格间隔\n");
scanf("%d",&a[k]);
k++;
while((c=getchar())!='\n')
{
scanf("%d",&a[k]);
k++;
}
printf("%d\n",a[0]);
}

为什么在while((c=getchar())!='\n')这个前面得再重复写一句 scanf("%d",&a[k]);
k++; 不然我输入的第一个数,就会被丢弃掉没写进数组里,求解
为什么先执行 getchar()的话会把第一个输入的字符读走??后面的数为啥就不会读走呢?为啥c=getchar()为读走数字见得空格?好好好多疑问哦...请赐教~

scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并保存数据到其它参数.scanf()读取匹配format(格式)字符串的输入. 当读取到一个控制字符, 它把值放置到下一个变量. 空白(tabs, 空格等等)会跳过. 非空白字符和输入匹配, 然后丢弃. 如果是一个在%符号和控制符间的数量, 那么只有指定数量的字符转换到变量中. 如果scanf()遇到一个字符集(用%[]控制字符表示), 那么在括号中的任意字符都会读取到变量中. scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF.
getchar()函数从STDIN(标准输入)获取并返回下一个字符,如果到达文件尾返回EOF.
所以scanf是根据你后边括弧里的格式来获取数据的,比如你的scanf("%d",&a[k]);
如果你输入2按enter,实际上你的输入流里边有两个字符‘0’和enter,scanf就会自动过滤enter将2赋值给a[k],但这时enter还是在你的输入流里边的,如果你这时用getchar()它就会获得enter的值,因为getchar是获得字符,而你的输入流里刚好第一个就是enter(2已被scanf取走);
对于 你写的while((c=getchar())!='\n')
{
scanf("%d",&a[k]);
k++;
}
会先执行c=getchar()在判断c是不是等于'\n',在执行你的循环体,
如果你输入123按enter,那么getchar会先取一个字符‘1’赋给c,在判断c是不是等于'\n',最后执行scanf,将23赋给a[k],

建议楼主初学C时多看源代码,尤其是库函数的源代码,那都是相当基本且经典的程序。如果你用微软的编译器可以多看看msdn!希望能解决你的疑惑!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-07
c=getchar() 会读走一个字符,程序中是用它来读走数字间的空格的,读到回车就结束。
但是第一次输入时如果先执行 getchar()的话会把第一个输入的字符读走,如果你输入 12 你的数组里只会存入 2
这个可以改用 do while来做,就不用多写一次 scanf了
do{
scanf("%d",&a[k]);
k++;
}while((c=getchar())!='\n');追问

为什么先执行 getchar()的话会把第一个输入的字符读走??后面的数为啥就不会读走呢?为啥c=getchar()为读走数字见得空格?好好好多疑问哦...请赐教~

追答

执行 getchar() 会从缓冲区里读走一个字符。
你先执行它,当然会把缓冲区里第一个字符读走,
执行完这个,后面执行 scanf("%d",&a[k]); 就会把一个整型数读走,这个数以不是数的字符结尾。如 123A 从缓冲区里读到A时不是数字就会以123给a[k],当然空格也是一样。
这个函数并不把后面不是数字的那个读走,它还在缓冲区里,这时再执行 getchar() 就会把后面那个不是数字的字符从缓冲区里读走。

第2个回答  2011-04-07
我看错了,第一个scanf("%d",&a[k])接收的是数字间的空格数,你这个程序有问题吧,第一次执行getchar())时刚好是\n.所以循环就没执行
第3个回答  2011-04-07
程序貌有问题,把scanf("%d",&a[k]);改成a[k]=c看看