C语言的一个小程序,帮忙看一下
输入一组数,用回车控制输完,再输出。但调试时老是输出和输入不一样,如输入“1234”则输出“2340”怎么改啊#include"Stdio.h"main(){inti,l...
输入一组数,用回车控制输完,再输出。但调试时老是输出和输入不一样,如输入“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]);
} 展开
#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]);
} 展开
5个回答
展开全部
问题出在第一个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就是不可预料的,也有可能是另一个整数。
说的可能不太明白,建议你学一学汇编,对底层编程有一些了解,这样能帮助你更好的理解程序在计算机内部的执行过程。
在有就是你程序实现的有些古怪。建议写标准的程序。
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
执行过程就是上面讲解的那样了.........................
所以你的程序有两点问题;
1.输入的时候提前要输入被getcher()吸收的非'\n'字符了,最好是空格了,并且后面的连续数字要用空格分隔开了.
2.就是你第一次循环完之后i已经达到你要的值了,可以不采用多余的变量length了,就更不用再加1了
回答者:雨中扇 - 助理 二级 4-5 13:40
的程序没有考虑字符getcher()处理的情况,所以空格也会被当作字符处理进了你输入的数字了.
执行过程就是上面讲解的那样了.........................
所以你的程序有两点问题;
1.输入的时候提前要输入被getcher()吸收的非'\n'字符了,最好是空格了,并且后面的连续数字要用空格分隔开了.
2.就是你第一次循环完之后i已经达到你要的值了,可以不采用多余的变量length了,就更不用再加1了
回答者:雨中扇 - 助理 二级 4-5 13:40
的程序没有考虑字符getcher()处理的情况,所以空格也会被当作字符处理进了你输入的数字了.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的第一个字符被getchar()接收了,存在c中
当第一次循环的时候,会执行;(c=getchar())!='\n'这个判断,接收第一个字符,当不为'\n'时才会执行下面scanf语句,所以scanf接收的是第二个字符开始的字符,也就是你输入4个字符,只接收后三个存在数组中,输出时第四个其实是没有意义的,因为并不知道那个位置存的是什么东西
在循环体加一句输出看看,c中应该存的是第一个字符
for(i=0;(c=getchar())!='\n';i++)
{scanf("%d",&a[i]);
printf("%c\n",c);
}
当第一次循环的时候,会执行;(c=getchar())!='\n'这个判断,接收第一个字符,当不为'\n'时才会执行下面scanf语句,所以scanf接收的是第二个字符开始的字符,也就是你输入4个字符,只接收后三个存在数组中,输出时第四个其实是没有意义的,因为并不知道那个位置存的是什么东西
在循环体加一句输出看看,c中应该存的是第一个字符
for(i=0;(c=getchar())!='\n';i++)
{scanf("%d",&a[i]);
printf("%c\n",c);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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++)
a[i]=c-48; //char--int
length=i; //length不必再加了,for循环已经加过了
for(i=0;i<length;i++)
printf("%4d",a[i]);
}
main()
{
int i,length;
int a[100];
char c;
printf("please input your order sqlist\n");
for(i=0;(c=getchar())!='\n';i++)
a[i]=c-48; //char--int
length=i; //length不必再加了,for循环已经加过了
for(i=0;i<length;i++)
printf("%4d",a[i]);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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;
a[length-1]=a[0]
for(i=1;i<length;i++)
printf("%4d",a[i]);
}
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;
a[length-1]=a[0]
for(i=1;i<length;i++)
printf("%4d",a[i]);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询