本教程主要适用于一些程序比赛或大公司机试中的输入数据的处理,总的来说,可以分为以下三种情况:
情况一:输入的测试样例有多组,每组需要相同逻辑的处理;
处理方案:在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;
}
希望本篇博客可以让大家少走很多弯路。