参考笔记:ACM模式各种输入总结C++版 - 知乎 (zhihu.com)
之前觉得就是输入没那么难,但是做了好几个厂的笔试题,着实给我整不会了。所以赶紧亡羊补牢吧!!
总结一下:输入的长度大小一般是给定的,不给定大小的情况我个人感觉很少。而且对于输入的分隔符无非就两种“,”和“ ”;
所以代码中有一些用while进行cin输入的,完全可以用for替代。
代码:
//这个文件是总结acm各种情况的输入,建议记忆
#include "acmcin.h"
using namespace std;
//按照acm的题型分为处理数字型,和处理字符串型
//首先要知道cin只能将空格和table作为分隔符!!!
//处理数字型
//已知长度,且以空格分割
//一般已知长度是指在数据前面输入数据的基本信息
/**************输入*****************/
// 3 4
// 1 2 3
// 4 5 6
// 7 8 9
// 10 11 12
/**********************************/
void shuzi_kongge()
{
int num = 0, len = 0;
cin >> num;
cin >> len;
vector<vector<int>>arr(num, vector<int>(len));
int temp = 0;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < len; j++)
{
cin >> arr[i][j];
/*temp;
arr[i].push_back(temp);*/
}
}
cout << "输入如下" << endl;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < len; j++)
{
cout << arr[i][j] << "\t";
}
cout << endl;
}
}
//已知长度,且以","分割
/**************输入*****************/
// 3
// 1,2,3,3,2
// 4,5,6,1,3
// 7,8,9,13,4
/**********************************/
void shuzi_douhao()
{
/*int num = 0;
cin >> num;
vector<int, vector<int>>arr(num);
string cur
while()
cout << "输入如下" << endl;*/
int n;
cin >> n;
//vector<vector<int>> vec(n, vector<int>(5));
vector<vector<int>> vec(n);
for (int i = 0; i < n; ++i)
{//注意这里一定要有i控制,用while容易一直输入导致错误
string s;
cin >> s;
replace(s.begin(), s.end(), ',', ' ');
/*cout << "测试" << endl;
cout << s << endl;*/
istringstream is(s);
string tmp;
//事先知道数组多长可以用for
//for (int j = 0; j < 5; ++j)
//{//内层循环也很重要
// is >> tmp;
// vec[i][j] = stoi(tmp);
//}
//事先不知道数组多长可以用while
while (is >> tmp)
{
vec[i].push_back(stoi(tmp));
}
}
//输出显示
for (int i = 0; i < vec.size(); i++)
{
for (int j = 0; j < vec[0].size(); j++)
{
cout << "\t" << vec[i][j];
}
cout << endl;
}
//return 0;
}
/*******************处理未知长度的输入应该很少,最起码也得有一个结束标志位**********************/
/*******************处理未知长度的输入应该很少,最起码也得有一个结束标志位**********************/
/*******************处理未知长度的输入应该很少,最起码也得有一个结束标志位**********************/
//未知长度,且以空格分割 //这个暂时有问题
/**************输入*****************/
// 1 2 3 3 2
// 4 5 6 1 3
// 7 8 9 13 4
/**********************************/
//这个由于未知长度,没法判断输入结束,需要知道其他更多的信息
void shuzi_kongge_weizhi()
{
vector<int>vec;
//vector<vector<int>>vec;
string s;
int num = 0, len = 0;
int i = 0;
bool flag = true; //记录一行的个数;
while (cin >> num)
{
vec.push_back(num);
if (flag)len++;
if (getchar() == '\n')
{
if (flag)
flag = false;
continue;
}
}
//输出显示
for (int i = 0; i < vec.size(); i++)
{
cout << "\t" << vec[i];
if ((i + 1) % len == 0)
cout << endl;
}
}
//未知长度,但是用","分割
/**************输入*****************/
// 1, 2, 3, 3, 2
// 4, 5, 6, 1, 3
// 7, 8, 9, 13, 4
/**********************************/
void shuzi_douhao_weizhi()
{
string s;
vector<int>vec;
while (cin >> s)
{
replace(s.begin(), s.end(), ',', ' ');
istringstream is(s);
int temp = 0;
string cur;
cout << "转化结果" << endl;
while (is >> cur)
{
vec.push_back(stoi(cur));
cout << "\t" << stoi(cur);
}
cout << endl;
}
}
/*******************处理未知长度的输入应该很少,最起码也得有一个结束标志位**********************/
/*******************处理未知长度的输入应该很少,最起码也得有一个结束标志位**********************/
/*******************处理未知长度的输入应该很少,最起码也得有一个结束标志位**********************/
//处理字符串
//以空格分割
/*********************************输入**************************************/
// good good study day day up
/*********************************输入**************************************/
void str_kongge()
{
vector<string>str;
string s;
while (cin >> s)
{
str.push_back(s);
if (getchar() == '\n')
{
s.clear();
break;
}
}
//输出结果
cout << "输出展示" << endl;
for (auto st : str)
{
cout << st << " ";
}
cout << endl;
}
//用","分割
void str_douhao()
{
vector<string>str;
string s;
//使用getline函数
while (getline(cin, s))
{
stringstream input(s);
//cout << input << endl;
string s1;
while (getline(input, s1, ','))
{
str.push_back(s1);
/*if (getchar() == '\n')
break;*/
s1.clear();
}
/*replace(s.begin(), s.end(), ',', ' ');
istringstream is(s);
string temp;
while (is >> temp) {
}
if (getchar() == '\n')
{
break;
}*/
}
//输出结果
cout << "输出展示" << endl;
for (auto st : str)
{
cout << st << " ";
}
cout << endl;
}