C/C++中的结束输入条件判断 (scanf、EOF、getchar()、cin.get()、getline)
本教程主要适用于一些程序比赛或大公司机试中的输入数据的处理,总的来说,可以分为以下三种情况:
情况一:输入的测试样例有多组,每组需要相同逻辑的处理;
处理方案:在C语言中可利用scanf("%d",&n)!=EOF,在C++中可以使用while(cin>>n)。
例如:计算两数之和,输入可能有多组样例。
#include <iostream>
using namespace std;
int main(){
int a,b;
while(scanf("%d %d",&a,&b)!=EOF){
cout<<a+b<<endl;
}
return 0;
}
或者使用C++的写法:
#include <iostream>
using namespace std;
int main(){
int a,b;
while(cin>>a>>b){
cout<<a+b<<endl;
}
return 0;
}
结果是这样的:
解释一下C语言中的scanf()函数,它的返回值可以分为以下几种情况:一般是返回按照指定格式输入变量的个数,但若遇到错误或者遇到end of file,则返回-1. 而恰好EOF是一个系统预定义的一个常量,它的值是-1。这样也就解释清楚了,下面验证一下:
#include <iostream>
using namespace std;
int main(){
int a,b;
cout<<"EOF的值为:"<<EOF<<endl;
int temp1 = scanf("%d",&a);
cout<<"此时scanf()函数的返回值:"<<temp1<<endl;
int temp2 = scanf("%d %d",&a,&b);
cout<<"此时scanf()函数的返回值:"<<temp2<<endl;
int temp3 = scanf("%d %d",&a,&b);
cout<<"此时scanf()函数的返回值:"<<temp3<<endl;
return 0;
}
情况二:当输入一个数组时,无法确定其长度时,通过输入换行还结束输入。
处理方案:在C语言中可利用getchar(),在C++中可以使用cin.get()。两者都表示从stdio流中读一个字符,也就是说从控制台中读取下一个字符。
例如:输入一个整型数组,再按序输出,注意没有给定输入数组的长度。
#include <iostream>
using namespace std;
int main(){
int A[100];
int i = 0;
for(i=0;;i++){
cin>>A[i];
if(getchar()=='n')
break;
}
for(int j=0;j<i+1;j++)
cout<<A[j]<<endl;
return 0;
}
或者简写成:
#include <iostream>
using namespace std;
int main(){
int A[100];
int i = 0;
while(cin>>A[i] && getchar()!='n'){
i += 1;
}
for(int j=0;j<i+1;j++)
cout<<A[j]<<endl;
return 0;
}
C++的写法:
#include <iostream>
using namespace std;
int main(){
int A[100];
int i = 0;
while(cin>>A[i] && cin.get()!='n'){
i += 1;
}
for(int j=0;j<i+1;j++)
cout<<A[j]<<endl;
return 0;
}
本题若是没有给定数组长度的上界,也就是数组不知道开多大,因为可能有100个数,1000个数,10000个数的输入。我们可以利用vector动态数组来实现:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vec;
int i = 0;
int x;
for(i=0;;i++){
cin>>x;
vec.push_back(x);
if(cin.get()=='n')
break;
}
for(int j=0;j<i+1;j++)
cout<<vec[j]<<endl;
return 0;
}
情况三:处理字符串的情况,在C++中因为支持了string类型,所以大大简化了关于字符串的一系列操作;
方案:处理连续非空的字符串,我们只要输入即可cin>>str;对于字符串中含有空格的情况,使用getline函数实现
#include <iostream>
using namespace std;
int main(){
string str;
cin>>str;
cout<<str<<endl;
return 0;
}
#include <iostream>
using namespace std;
int main(){
string str;
getline(cin,str);
cout<<str<<endl;
return 0;
}
这里要注意的是,如果在一个程序中先使用cin>>str输入,然后再使用getline函数的话,需要再cin>>str之后使用cin.get()处理回车才行,也就是把回车当做cin.get()的输入,毕竟用户确实输入了一个回车。
#include <iostream>
using namespace std;
int main(){
string str;
cin>>str;
cout<<str<<endl;
cin.get();
getline(cin,str);
cout<<str<<endl;
return 0;
}
希望本篇博客可以让大家少走很多弯路。
相关知识
while((c = getchar() ) != EOF)的循环结束
ACM之while(scanf(“%d”,&n)!=EOF)
scanf(“%d”,&b)!=EOF;
C++语言学习笔记8:宠物小屋
运用C语言设计一个电子宠物程序,实现下列基本功能。
请用C语言编出一个简单的宠物管理系统。
浙大PAT练习题1001
a=b++,c++和a=(b++,c++)的区别
问题 R: 【字符串】动物简介(KMP模板题)
c语言链表宠物4节点
网址: C/C++中的结束输入条件判断 (scanf、EOF、getchar()、cin.get()、getline) https://www.mcbbbk.com/newsview759410.html
上一篇: 求方程ax2+bx+c=0的根, |
下一篇: Python 函数 int(x, |
推荐分享

- 1养玉米蛇的危害 28644
- 2狗交配为什么会锁住?从狗狗生 6661
- 3我的狗老公李淑敏33——如何 6212
- 4南京宠物粮食薄荷饼宠物食品包 4543
- 5豆柴犬为什么不建议养?可爱的 4516
- 6中国境内禁养的十大鸟种,你知 4412
- 7湖南隆飞尔动物药业有限公司宠 4238
- 8自制狗狗辅食:棉花面纱犬的美 4232
- 9家养水獭多少钱一只正常 4184
- 10广州哪里卖宠物猫狗的选择性多 4099