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注释掉,这时候程序也能正常运行!!!而且结果也正确!!!
为什么啊???
*/

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

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

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