- 从一个小程序展开
题目:输入一串数字和任意数目空格,计算所有数字的和
#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);
}
从中学到的知识有三点如下
- scanf作为一个函数,是有返回值的,其返回值在程序注释中已有说明
- ch=getchar()可以用于读取输入,且其读取后的字符是不会放回到原来的流中的。
- 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是用于输出,具体怎么用还不是太清楚,日后更新!!