笔试中如果遇到这种,特别麻烦,有时候可能会被在一些细节处出问题,现总结如下。
首先,读取一行数据,最基本的方法:
string str_line;
while (getline(fin, str_line))
{
cout << str_line << endl;
}
1、利用“cin + getchar()”
输入一行,并以空格隔开,空格处理可以留给cin去除,getchar
主要判断是否换行(输入结束),代码如下:
vector<int> vec
int num;
while (cin >> num)
{
vec.push_back(num);
char ch = getchar();
if(ch == '\n')
break;
}
eg:输入数据为1 5 6 7
,vec中的数据为{1, 5, 6, 7}。
-
一点说明:其中1、5中间有3个空格,
getchar()
会获取一个字符,不是换行符,现在缓冲区中剩下5 6 7
,继续while,cin >> num
会自动会自动处理前面的空格,只获取最后的num。 -
如果获取的是string,把num改为string类型就可以了。(vector的类型也需要改变)。
以上处理方法最简单,不过长时间不写,可能会存在忘记的情况。
refer:【C++ 输入一行数字或字符串(未知个数),以空格间格,换行后结束输入并输出】
2、利用“std::getline() + STL”
利用std::getline()
读入一行数据到std::string
,然后用std::string
的find()
和substr()
方法进行解析,最后利用std::stoi()/ std::stol()
做类型转换。针对于空格的代码为:
string str;
getline(cin, str);
vector<int> vec = split_space(str);
其中split_space定义为:
vector<int> split_short(const string &con_str)
{
vector<int> vec;
string str(con_str);
while (!str.empty())
{
int pos = str.find(" ");
if (pos != string::npos && pos != 0)
{
string temp = str.substr(0, pos);
str = str.substr(pos + 1);
vec.push_back(stoi(temp));
}
else if (pos == string::npos)
{
//最后一个数字
vec.push_back(stoi(str));
break;
}
else
{
//防止连续空格的情况
str = str.substr(pos + 1);
}
}
return vec;
}
3、利用“istringstream = getline()”
这里的代码结构比较简单,istringstream
定义于#include <sstream>
文件中。
void split_getline(const string &con_str, vector<int> &vec, char delim)
{
string token;
std::istringstream tokenStream(con_str);
while (getline(tokenStream, token, delim))
{
if(token.size() > 0) //空格时,token中为空的情况
vec.push_back(std::stoi(token));
}
}
refer:【How to split a string in C++ – Solution1.3】
4、通用代码(多种分隔符的情况)
如果遇到以‘,’分隔或者‘, ’(逗号+空格)等方式进行分隔,也是类似的情况,可以2中的方法可以写得更加通用一些,代码如下:
string str;
getline(cin, str);
vector<int> vec;
split_general(str, vec, ", ");
void split_general(const string &con_str, vector<int>& vec, const string &str_seperator)
{
int len_sep = str_seperator.size();
string str(con_str);
int pos = 0;
while ((pos = str.find(str_seperator)) != string::npos)
{
if (pos != 0)
{
string str_num = str.substr(0, pos);
vec.push_back(stoi(str_num));
}
str = str.substr(pos + len_sep);
}
//解决str为空时stoi异常的问题
if (!str.empty())
{
vec.push_back(stoi(str));
}
}