C语言的一个小程序,帮忙看一下

来源:百度知道 编辑:UC知道 时间:2024/04/29 20:38:27
输入一组数,用回车控制输完,再输出。但调试时老是输出和输入不一样,如输入“1 2 3 4”则输出“2 3 4 0”怎么改啊
#include "Stdio.h"
main()
{
int i,length;
int a[100];
char c;
printf("please input your order sqlist\n");
for(i=0;(c=getchar())!='\n';i++)
scanf("%d",&a[i]);
length=i+1;
for(i=0;i<length;i++)
printf("%4d",a[i]);
}

问题出在第一个for循环中。你的程序的循环过程是这样的:你从键盘输入1234/n。“/n”代表回车。注意,1234可以看成一个正数也可以看成4个字符,你输入的这5个字符被送入键盘缓冲区,每个字符占一个字节的存储空间,存储的是这些字符三ansic码。然后程序执行到for循环,i=0;然后是语句“c=getchar()”因为getchar函数只取得一个字符,也就是键盘缓冲区的第一个字节的内容。也就是1的ansic吗,赋给c;判断出c不是“/n”,然后执行“scanf("%d",&a[i]);”,该语句的执行过程是:从键盘缓冲区读出一个正数并赋给a[0].上面说了,在缓冲区存储的既可以看作是字符也可以看作是整数,如果是字符的话,每个字符占一个字节的空间,如果是正数的话,则不限制是一个字节的空间,而是连续几个字节,这要取决你的分隔符,比如如果你的scanf语句是“scanf("%d, %d",&a,&b)”则两个整数间的分隔符就是“,”。此时程序把234看作一个整数,并把它赋给a[0](因为前面getchar()函数已经取得第一个字符1,所以scanf函数从下一字节开始取,由于取的是整数,故以回车符为分隔,也就是234)。接着程序往下执行,
i++;也就是i=1。接着在执行“c=getchar() ”,此时getchar()函数取的缓冲区中的回车符,循环结束。程序继续执行下一语句:length=i+1。结果lingth=2.然后输出,因为a[0]=234,所以输出的就是234,a[1]并没有取得输入,它的值是不可预料的。这就是你的输出。
你可以注意一下输出的格式,你写的输出格式为"%4d",也就是一个整数占4个字符长度,且是右对齐,可以看到你的输出的234是作为一个整数的,而不是三个。后面那个0就是不可预料的,也有可能是另一个整数。
说的可能不太明白,建议你学一学汇编,对底层编程有一些了解,这样能帮助你更好的理解程序在计算机内部的执行过程。
在有就是你程序实现的有些古怪。建议写标准的程序。

回答者:休休休休 - 助理 二级 4-5 13:50

执行过程就是上面讲解的那样了.....................