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看看

C语言,数组输入遇到问题求大神指教:哪里错了,如何改正,为什么会出现...
scanf的格式加'\\n',含义特殊,不是输入一个回车,而是输入完一个数字后,必须等待一个非空格、制表符、回车的输入,程序才会继续。所以你那样写,第一次循环输入2回车,不会进入下一次循环,而是等待再次输入,然后你输入3的时候2被存储在元素1中,进入下一个循环,已经有3了还要等待输入,于是你输入...

C语言输入一个数组后将数组里的数相加,为什么输出结果不对?_百度知 ...
第一,定义的浮点数变量sum没有初始值,应该在定义的时候给他赋初始值为0。第二,循环体没有加花括号,导致只有读入语句是执行循环的,而下面的累加到sum的语句则要到循环结束以后才执行一次,起不到累加的作用。第三,格式化输入语句scanf在给float类型输入时是不能指定小数位数的(最多只能限定总位数...

c语言中如何输入数组中的数
int i,j;float students[10];float sum=0,max=0;for(i=0;i<10;i++){ printf("请输入的学生的成绩:");scanf("%f",&students[i]);if(students[i]>max)max=students[i];sum=sum+students[i];} printf("这几个同学的最高分为:%f\\n平均成绩为:%.2f\\n",max,sum\/10);return 0...

数组问题(c语言),如何让输入者定义个数,并输入数值,形成数组
严格意义上讲,c语言里面定义数组时其长度不能为变量,必须为固定值,因为c语言程序在定义数组时,必须先给数组开辟一个内存空间。不过,你所提的要求还是可以实现的,一般的做法是,可以先假设一个较大的数(不超过你所想输入的输入的数组长度的最大值MXLENGTH,)作为初始定义时数组大小,然后在输入数...

C语言怎么让键盘输入数字到数组里?
1、首先打开电脑的编辑软件。然后创建编辑项目。2、创建文件指针和字符型char。再读取文件内容。3、然后用for语句进行接受数据。再用getchar语句接受键盘的输入。4、然后用foput函数。再将数据写入到文件。5、然后用fclose函数关闭文件。再返回数值。6、运行程序,输入数值。再打开文件,就可以发现键盘输入...

C语言如何把输入进去的数放到数组中
有两种方式:1 先输入数值,在存放在数组的对应位置中,即赋值给对应元素。如 scanf("%d",&i);a[k] = i;就是先输入到变量i中,然后把i存储在a的第k个元素中。2 直接输入到数组对应元素中。如 scanf("%d",&a[k]);与1中的例子是相同效果,只是减少了中间变量的使用。

C语言题目:键盘随机输入5个数,请从大到小排列输出,并输出其中所有的素数...
int a[N],i,j,temp; \/\/定义数组a,变量i,j和中间存储变量temp printf("please input %d numbers\\n",N); \/\/输出文本,"请输入N个数字(此处N=5)"for(i=0;i<N;i++) \/\/循环语句,利用i循环将N个数存入数组a[i]scanf("%d",&a[i]);for(i=0;i<N-1;i++)for(j=0;j<N...

C语言中,对于不知道长度的数组怎样输入。。。
1、一维数组程序举例:冒泡法。得到结果进行输出。二维数组常称为矩阵。把二维数组写成行列的排列形式,可以形象的理解二维数组的逻辑结构。2、C语言中不能定义未确定个数的数组,不过可以用指针来变相的完成你的要求。3、输入数组需要使用指针获取地址后,就能对得到的数组就行操作了。

c语言问题 通过键盘将10个整数输入到一维数组中,并把该数组中所有偶数放...
1、首先定义一个字符串:$str = 'apple';其次定义一个数组:$arr = array('apple', 'orange', 'strawberry')。2、加入函数:in_array(),判断$arr中,是否存在$str。如果存在则在屏幕上打印出:$str的值;如果不存在,则在屏幕上打印:找不到。3、将编写的PHP文件保存,并在浏览器运行,观察...

c语言中的调试时输入数字 :1 2 3 4 5 6 7 8 9 0.回车,显示unhandled exce...
你没有分配内存,仅仅定义一个指针,就要去赋值,当然会暴力访问了。应该顶一个数组int num[10];或者分配int* num =(int*)malloc(10*sizeof(int));

相似回答