用C语言写的一个程序:有一个已排好的数组,要求输入一个数后,按原来排序的规律将它插入数组中。

#include<stdio.h>
int main()
{
int a[20],i,n,x,k;
printf("请输入一组顺序数(从小到大的顺序):");
for(i=0;getchar()!='\n';i++)
scanf("%d",&a[i]);
n=i; //n表示数组内数字的个数
printf("请输入需要插入的数:");
scanf("%d",&x);
for(i=0;i<n;i++)
if(x<a[i])
{
for(k=n-1;k>=i;k--)
a[k+1]=a[k];
a[i]=x;
break;
}
else a[n]=x;
for(i=0;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
}
我是想自己输入数字,用空格分开,系统自己算出数字个数,在进行插入排序,但是总是输不出结果,我觉得问题是出在什么“输入缓冲区”里,有哪位高手可以指点一下吗?急需,谢谢!

第1个回答  推荐于2018-03-21
主要有两个问题:
第一:for(i=0;getchar()!='\n';i++)==>for循环里,每次执行前先检测getchar()!='\n',而我们需要的是要在输入数字后再检查是否输入回车,所以放在循环后面:

for( i=0; ;i++ )
{
scanf("%d",&a[i]);
if( getchar() == '\n' )
break;
}
第二:i 是从0开始计数的,所以数组数还要加1.比如输入0 1 2 3,i为3,但是是4个数。

//如下能正常运行:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int a[20],i,n,x,k;
printf("请输入一组顺序数(从小到大的顺序):");
for( i=0; ;i++ )
{
scanf("%d",&a[i]);
if( getchar() == '\n' )
break;
}
n = i + 1; //n表示数组内数字的个数
printf("请输入需要插入的数:");
scanf("%d",&x);
for(i=0;i<n;i++)
{
if( x<= a[i] )
{
for( k= n-1; k >= i; k--)
{
a[k+1]=a[k];
}
a[i]=x;
break;
}
}
for(i=0;i<=n; i++)
{
printf("%d ",a[i]);
}
printf("\n");
system("pause");
}追问

你好,我还是不太理解为什么先检查是否输入回车和先赋值会有这么大的不同,能详细解释一下吗?

追答

对于for循环,for( 表达式1; 表达式2; 表达式3 )
第一次循环前执行表达式1;每次循环前都执行表达式2;然后执行大括号里的内容。每次执行完大括号里的后,都要执行表达式3.
考虑你实际的输入情况,for开始后,如果你打算输入三个数:1 2 3.
那么你的按键是这样的: 1 空格 2 空格 3 回车
那么for循环里就应该这样执行的:
i为0==》scanf("%d",&a[0]); ==》getchar()是空格不是'\n',继续进入下一个循环==》依次类推

加入是你写的这样:
for(i=0;getchar()!='\n';i++)

{
scanf("%d",&a[i]);

}
那么,根据上面for循环的执行规则,程序先执行getchar()等待你输入,但是你第一个输入的是1,往后的全乱套了。

本回答被提问者采纳
第2个回答  2012-11-04
代码如下:
#include<stdio.h>
int main()
{
int a[20],i=0,n,x,k,j;
printf("请输入一组顺序数(从小到大的顺序):");
while(~scanf("%d", &a[i]))
{
i++;
if(getchar() == '\n') break; //在这判断,否则原先的第一个数字读不进去
}
n=i;
for(i=0;i<n;i++) printf("%d ",a[i]);
printf("请输入需要插入的数:");
scanf("%d",&x);
if(a[0]>x) // 如果插入的数字比第一个还小,a[0]=x
{
for(j=n;j>=1;j--) a[j] = a[j-1];
a[0] = x;
}
else if(a[n-1]<x) a[n]=x; // 如果比最后一个还大,a[n]=x
else
for(i=0;i<n-1;i++) //在中间
{
if(a[i]<=x && a[i+1]>=x) //找到位置
{
for(j=n;j>=i+2;j--) a[j] = a[j-1]; // 从后往前赋值
a[i+1] = x; //
break;
}
}
for(i=0;i<=n;i++) printf("%d ",a[i]);
printf("\n");
}本回答被网友采纳