最近做了华为的笔试,笔试题的输入流相比其他公司奇怪得不行,被弄得很头疼,特此整理一下如何C++取数据流
输入流的形式
先观察输入流的重要特征,一般会告知有几行数据 ①每行数据的长度是否已知 ②每行数据是用什么分隔的,是’,‘还是’ ’ ?给的数据是什么类型的(重要?有时候给的字符串类型的数字)
数据长度已知
对于每行数据长度已知的输入,简单地使用cin即可,举例: 第一行输入一个数字N表示有N行 下面N行数据的第一个字符M表示这一行接下来有M个数据
int N;
int main(){
cin >> N;
cout << N << endl;
string tmp;
vector<vector<int>> stored;
stored.reserve(N);
for(int i=0; i<N; i++)
{
int len;
cin >> len;
vector<int> tmp(len, 0);
for(int j=0; j<len; j++)
{
cin >> tmp[j];
}
stored.push_back(tmp);
}
cout << endl;
for(int i=0; i<stored.size(); i++)
{
for(int j=0, end=stored[i].size(); j<end; j++)
{
cout << stored[i][j] << ", ";
}
cout << endl;
}
}
输入输出
数据长度未知
数据用空格隔开
如果数据长度未知,用cin一个个取数据,用getchar检测"\n"判断是否到行结尾,举例: 第一行输入一个数字N表示有N行 下面N行数据每行表示一堆用空格隔开的字符串
int N;
int main(){
cin >> N;
string S;
vector<vector<string>> stored;
stored.reserve(N);
vector<string> tmp;
while(cin >> S)
{
tmp.push_back(S);
if(getchar()=='\n'){
stored.push_back(tmp);
tmp.clear();
}
}
cout << endl;
for(int i=0; i<stored.size(); i++)
{
for(int j=0; j<stored[i].size(); j++)
{
cout << stored[i][j];
if(j==stored[i].size()-1) cout << endl;
else cout << ", ";
}
}
return 0;
}
输出输出 注意,如果字符串换成数字,方法是相同的
数据间用 ','隔开
数据长度未知且用 ','隔开,我们无法通过cin取到对应字符串,这时候借助getline取一行数据,然后用stringstream分割 第一行输入一个数字N表示有N行 下面N行数据每行表示是一堆 ','分隔的字符串
int N;
int main(){
cin >> N;
vector<vector<string>> v;
string str;
while(getline(cin, str))
{
vector<string> tmp;
stringstream ss(str);
while(getline(ss, str, ','))
{
tmp.push_back(str);
}
v.push_back(tmp);
}
cout << endl;
for(int i=0; i<v.size(); i++)
{
for(int j=0; j<v[i].size(); j++)
{
cout << v[i][j];
if(j==v[i].size()-1) cout << endl;
else cout << ", ";
}
}
return 0;
}
输入输出
总结
文章介绍了如何从常见的笔试题目中取得数据流,文章的代码在我的github中HowToGetInput对应的文件夹下,感谢观看
|