2 perfectwangandy PerfectWangAndy 于 2017.01.12 21:14 提问

C语言。从键盘上输入一些整数,求所有正数之和,当输入0或负数时,程序结束。

//从键盘上输入一些整数,求所有正数之和
//当输入0或负数时,程序结束
#include
int main(){
printf("请输入:");
int sum = 0;
int a;
scanf("%d", &a);//输入第一个数
getchar();
if(a<=0)exit(1);
while (a>0) {
sum = sum + a;
scanf("%d", &a);
getchar();
}
printf("sum = %d\n", sum);
return 0;
}
/*
我开始是这么想的:
scanf是从缓冲区中取值的,
而缓冲区中有两个字符,
一个是从键盘输入的a,
一个是输完a之后按下的回车。
我在每个scanf后面紧接着加getchar是要把回车取出来,好让后面的scanf能够正常工作。
若没有getchar的话,后面的scanf将会直接从缓冲区中读取,这时读取出来的将会是回车。
/
/

但是!!!
我后来尝试把getchar注释掉,这时候程序也能正常运行!!!而且结果也正确!!!
为什么啊???
*/

3个回答

caozhy
caozhy   Ds   Rxr 2017.01.12 23:53

getchar使得程序结束后不直接退出,而是等你按任意键再结束,它没有实质性的功能

Zindow
Zindow   2017.01.13 00:24

貌似scanf在读取数字的时候会把非数字的部分忽略掉,所以当scanf在读取数字的时候已经把回车给忽略掉了,所以你这里不用吃回车也可以。
当然,你加了getchar来吃回车,它把回车吃掉了,也没问题,不过我不知道它会不会把负号给吃掉,这是一个问题。

Zindow
Zindow 回复有时很奇怪: 你用scanf("%d",&n)读入一个整数的时候,scanf会一直在缓冲区里读取,直到遇到一个整数,中间的空白字符都会被丢弃。如果你觉得换行需要吃掉的话,那么按道理空格也要咯?
11 个月之前 回复
PerfectWangAndy
PerfectWangAndy 负号和数字是一个整体存储在变量中的,所以没有负号的问题。但是我做过一个实验,无论是scanf还是getchar,都会把'\n'存起来放在缓冲区里,所以我还是不明白啊。
11 个月之前 回复
Z_yichen
Z_yichen   2017.01.13 09:05

scanf("%d")是在stream里面读的时候,会自动忽略空格符,和换行符,比如scanf(" %d")一样可以读,如果想读出换行符,可以用getchar(),scanf("%c");

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!