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会一直在缓冲区里读取,直到遇到一个整数,中间的空白字符都会被丢弃。如果你觉得换行需要吃掉的话,那么按道理空格也要咯?
一年多之前 回复
PerfectWangAndy
PerfectWangAndy 负号和数字是一个整体存储在变量中的,所以没有负号的问题。但是我做过一个实验,无论是scanf还是getchar,都会把'\n'存起来放在缓冲区里,所以我还是不明白啊。
一年多之前 回复
Z_yichen
Z_yichen   2017.01.13 09:05

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
001分别计算输入数中的正数和负数之和各为多少
#import int main(int argc,const char * argv[]) {     @autoreleasepool {                  // insert code here...         NSLog(@"Hello, World!请输入10个数\n");        int a[10]
任意输入10个数,计算所有正数的和、负数的和以及10个数的和
/**********************************************************任意输入10个数,计算所有正数的和、负数的和以及10个数的和。. QQ139767**********************************************************/#include main(){ int a; int b=0,c=0,d
java程序: 输入数量不确定的正数和负数(一次输入一个), 然后打印正数和负数的个数,当输入0时,程序停止
import java.util.Scanner;public class CountNumber { /* * 输入数量不确定的正数和负数(一次输入一个), 然后打印正数和负数的个数,当输入0时,程序停止 */ public static void main(String[] args) { // TODO Auto-generated
从键盘输入10个整数求和,输入0结束
代码入下:#include<iostream> using namespace std; int main() { int n = 0;//输入变量 int sum = 0;//存放和的变量 cout << "请输入数,输入0结束!" << endl; cin >> n ; while (n != 0) { sum += n;
c语言编写从键盘上任意输入10个数,分别统计出输入的偶数或奇数分别的平均值
#include int main(int argc, const char * argv[]) {         int i,a;     int c=0,x=0,n=0,m=0;            for(i=1;i     {         scanf("%d",&a);         if(a%2==0)         {           
(c++)从键盘输入任意20个整型数,统计其中的负数个数并求所有正数的平均值。 保留两位小数
#include #include using namespace std; int main() { int a[20]; int j=0,k=0; double sum=0; for(int i=0;i cin>>a[i]; for(int i=0;i { if(a[i] j++; else if(a[i]>0) {     sum+=a[i];     k+
从键盘输入一个整数,判断它是正数,负数,0
代码如下:import java.util.Scanner;class Demo7{ public static void main(String[] args)  { Scanner sc=new Scanner(System.in); System.out.println(&quot;请输入一个整数:&quot;); int num=sc.nextInt(); //判断 if(num&amp;gt;0) S...
从键盘输入一组非0整数,以输入0为结束标志,求这组整数的平均值,并统计其中正数和负数的个数。(根据循环变量的初值、终值无法判断出循环次数时建议使用while或do while语句完成)。
从键盘输入一组非0整数,以输入0为结束标志,求这组整数的平均值,并统计其中正数和负数的个数。(根据循环变量的初值、终值无法判断出循环次数时建议使用while或do while语句完成)。 #include using namespace std; int main() { int a,i=0,sum=0.0,m=0,n=0; cout<<"请输入一组整数:"; whi
输入n个数,判断正数.负数.0的个数
#include int main() { float p[100]; int i, m, n, k, l; m = 0; k = 0; l = 0; scanf_s("%d", &n); printf("请输入%d个数:", n); for (i = 0; i < n; i++) { scanf_s("%f", &p[i]); if (p[i]>0) m++;
从输入的一批正整数中求出最大值、最小值和平均值,输入0结束数据的输入
从输入的一批正整数中求出最大值、最小值和平均值,输入0结束数据的输入。C语言程序