学习C++第2天

  • 从一个小程序展开
    题目:输入一串数字和任意数目空格,计算所有数字的和
#include<stdio.h>
#include<stdlib.h>//atoi的头文件,字符串转化为整形
#include<ctype.h>//isdigit的头文件
#define maxSize 10
int main(){
	char elem;
	char str[maxSize];
	printf("请在这里输入数字和任意个空格:");
	scanf("%c",&elem);
	int i=0;
	int sum=0;
	int number;
	while(elem!='\n'){
		while(elem!=' '&&elem!='\n'){//注意最后一个数字的后面一个字符是“enter”产生的\n,不能把这个字符也放入临时数组中
			str[i++]=elem;//将数字放入一个临时数组中
			scanf("%c",&elem);
		}
		str[i]='\0';
		if(i>10){
			printf("错误:输入数字过大");
			return -1;
		}
		if(elem==' '||elem=='\n'){//遇到空格或者\n代表一个数字输入结束.注意最后一个数字的特殊情况,其后是“enter”产生的\n
			number=atoi(str);//将临时数组中的数字转化成数
			sum+=number;//累加
			i=0;
		}
		//但是下一个字符仍是空格该怎么办?
		while(elem==' '){//若仍是空格则继续输入直到输入有效数字
			scanf("%c",&elem);
		}
	}
	printf("结果:");
	printf("%d\n",sum);
	return 0;
}

上面这个函数是我写的,但是感觉写的比较啰嗦,我选择了把用户所有输入的字符当作单个字符处理,所以里面就会有一项将一串字符转化为整形数字的过程。
下面是小甲鱼的代码,精简,高效,感概要学习的地方还有很多!!

#include<stdio.h>
#include<stdlib.h>
void main{
	int i;
	int sum=0;
	char ch;
	printf("请输入一串整数和任意数目的空格:");
	while(scanf("%d",&i)==1){//scanf是个函数,当他得到正常类型数据的时候返回值是1
		sum+=i;
		while((ch=getchar())==' ');//注意后面这个分号,意味着遇到空格不执行任何操作,其功能是屏蔽空格
		if(ch=='\n'){
			break;
		}
		ungetc(ch,stdin);//将变量ch中存放的字符退回给stdin输入流,原因在于上面的ch=getchar(),getchar()取出一个字符给到ch,取出的数字要退回给数据流
	}
	printf("结果是:&d",sum);
}

从中学到的知识有三点如下

  1. scanf作为一个函数,是有返回值的,其返回值在程序注释中已有说明
  2. ch=getchar()可以用于读取输入,且其读取后的字符是不会放回到原来的流中的。
  3. ungetc(ch,stdin);的运用方法是专门针对以上get所使用的,功能是将ch中的字符退回到输入流中
    以下是C++版本
#include<iostream>
int main(){
	int sum=0;
	cout<<"请输入一串整数和任意数目的空格";
	int i;
	while(cin>>i){
		sum+=i;
		while(cin.peek()==' '){
			cin.get();
		}
		if(cin.peek()=='\n'){
			break;
		}
	}
	cout<<"结果是:"<<sum<<endl;
	return 0;
}

其中cin是用于获取输入,用户通过键盘输入的字符首先存储到系统的键盘缓冲区,然后<<操作符用于提取缓冲区的字符到cin输入流,
其中cout是用于输出,具体怎么用还不是太清楚,日后更新!!

猜你喜欢

转载自blog.csdn.net/qq_41935906/article/details/82817206