前言
秋招第一次笔试,没怎么准备传统OJ(ACM模式)类型的题,逗号分隔+每排数量不一样的输入当场给我整麻了,吸取失败的经验教训,在此整理了ACM模式的输入读取处理。
1. 简单输入
1.1 空格间隔
输入几个变量的值,以空格隔开。
示例:
1 2
#include <iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
//处理题目
//cout << a <<" " << b << endl;
return 0;
}
1.2 逗号间隔
输入几个变量的值,以逗号隔开。
//思路:用一个char型变量接收逗号。
示例:
1, 2, 3
#include<iostream>
using namespace std;
int main()
{
int a, b, c;
char s;
cin >> a >> s >> b >> s >>c;
//处理题目
//cout << a <<" " << b << " " << c <<endl;
return 0;
}
2. n个输入
2.1 空格隔开
开始输入一个N,接下来输入N个数据,以空格隔开。
示例:
3
1 2 3
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; ++i)
{
cin >> nums[i];
}
//处理题目
/*for (int i = 0; i < n; ++i)
{
cout << nums[i] << " ";
}*/
return 0;
}
2.2 逗号隔开
开始输入一个N,接下来输入N个数据,以逗号隔开。
示例:
3
1,2,3
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin >> n;
char s;
vector<int> nums(n);
for (int i = 0; i < n - 1; ++i) {
cin >> nums[i] >> s;
}
cin >> nums[n - 1];
//处理题目
/*for (int i = 0; i < n; ++i)
{
cout << nums[i] << " ";
}*/
return 0;
}
3. 不指定数量的一行输入
输入不指定数量的一行数据,以空格或逗号隔开。
//思路:不指定vector大小,逐个压入;通过cin.get()从缓存中读取一个字节,如果是换行符’\n’就终止。
示例1:
1 3 5 7 9
示例2:
2,4,6,8
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> nums;
int num;
int n=0;
while (cin >> num) {
nums.push_back(num);
++n;
if (cin.get() == '\n') break; //cin.get()可换为getchar()
}
//处理题目
/*for (int i = 0; i < n; ++i)
{
cout << nums[i] << " ";
}*/
return 0;
}
4. n行,每行m个输入
4.1 空格间隔
开始输入一个N,接下来输入N行数据,每行有M个数据(题目给定或也在第一行输入),以空格隔开。
示例:
3 3
1 2 3
4 5 6
7 8 9
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
vector<vector<int>> nums(n,vector<int>(m));
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
cin >> nums[i][j];
}
}
//处理题目
/*for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
cout << nums[i][j];
}
cout << endl;
}*/
return 0;
}
4.2 逗号间隔
开始输入一个N,接下来输入N行数据,每行有M个数据(题目给定或也在第一行输入),以逗号隔开。
示例:
3,3
1,2,3
4,5,6
7,8,9
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n, m;
char s;
cin >> n >> s >> m;
vector<vector<int>> nums(n,vector<int>(m));
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m-1; ++j)
{
cin >> nums[i][j] >> s;
}
cin >> nums[i][m-1];
}
//处理题目
/*for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
cout << nums[i][j];
}
cout << endl;
}*/
return 0;
}
5. n行,每行不指定输入数量
开始输入一个N,接下来输入N行数据,每行不指定数据的数量,以空格或逗号隔开。
示例1:
3
1
1 2
1 2 3
示例2:
5
101,2
102,3
103,5
104,2,101,102
105,4,103
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n,num;
char s;
cin >> n;
vector<vector<int>> nums(n);
for (int i = 0; i < n; ++i)
{
while (cin >> num)
{
nums[i].push_back(num);
if (cin.get() == '\n') break;
}
}
//处理题目
/*for (int i = 0; i < nums.size(); i++)
{
for (int j = 0; j < nums[i].size(); j++)
{
cout << nums[i][j] <<" ";
}
cout << endl;
}*/
return 0;
}
5.x 其他方法
仅限以逗号隔开的情况。
#include<iostream>
#include<sstream>
#include<string>
#include<vector>
using namespace std;
string replaceToSpace(string& s) {
int len = s.size();
cout << "长度为:" << len << endl;
// 统计空格数量
for (int i = 0; i < len; i++)
{
if (s[i] == ',')
s[i] = ' ';
}
return s;
}
int main()
{
int n;
cin >> n;
vector<vector<int>> nums(n);
//读取一行数据为string,将逗号替换为空格,使用istringstream自动分隔字符串再输入给临时变量(自动将类型转换为int),压入第二层vector
for (int i = 0; i < n; ++i) {
string s;
cin >> s;
replaceToSpace(s);
istringstream is(s);
int tmp;
while (is >> tmp)
{
nums[i].push_back(tmp);
}
}
//处理题目
/*for (int i = 0; i < nums.size(); i++)
{
for (int j = 0; j < nums[i].size(); j++)
{
cout << nums[i][j] << " ";
}
cout << endl;
}*/
return 0;
}
参考
ACM模式各种输入总结C++版
ACM题目中输入数据的处理(C++版)
结语
秋招加油鸭~