这篇文章主要介绍了C++ stringstream格式化输出输入,首先string str; cinstr;遇到空格结束;于是乎产生了getline(),可与得到一行字符串;空格自动去掉,下面来看看文章的详细内容,需要的小伙伴可以参考一下
最近在笔试时经常遇见各种输入问题,于是细心总结一波;首先string str; cin>>str;遇到空格结束;于是乎产生了getline(),可与得到一行字符串;空格自动去掉,只要不讲cin和getline混用即可
cin.getline(s,k);
接收一行中k
个字符,可以接收空格
cin.getline()
实际有三个参数,cin.getline
(字符串,接收个数,结束字符);
当第三个参数省略时,系统默认为 '\0'
;
getline(cin,s);
和cin.getline()
类似,读入一行字符串,值得注意的是cin.getline()
属于istream
流,而getline()
属于string
流,二者并不相同。
StringStream
这个东西单独讲,比较重要,包含在sstream
库中。
istringstream
类用于执行C++风格的串流的输入操作。ostringstream
类用于执行C风格的串流的输出操作。stringstream
类同时可以支持C风格的串流的输入输出操作。
然后stringstream
的作用就是从string
对象读取字符或字符串。
string s = "ABCD";
stringstream ss(s);
char ch;
while(ss>>ch){
cout << ch << " ";
}
//运行结果
//A B C D
又例如:
string s = "hello world";
stringstream ss(s);
string str;
while(ss>>str){
cout << str << " ";
}
//运行结果
//hello world
在某些题目需要处理字符串时,这些题目往往是输入的一行中包含多个字符以及空格,这个时候就可以利用 stringstream进行单个字符或者单个字符串分析处理了
例子程序:
int main()
{
string line;
int k = 1;
cout << "===============case1================" << endl;;
while (getline(cin, line)) //可与读到包含空格, ;等字符;但是在ss>>x时被截断
{
int sum = 0, x;
stringstream ss(line);
while (ss >> x)
{
sum += x;
}
cout << "the sum is :" << sum << endl;
++k;
cout << endl;
cout << "===============case" << k << "================" << endl;;
}
return 0;
}
-输出:
===============case1================
1 2 3 4 5
the sum is :15===============case2================
1,2,3,4,5
the sum is :1===============case3================
1 a 2 b 3
the sum is :1===============case4================
a 1 1 1 1
the sum is :0===============case5================
另外一组:
int main()
{
string line;
int k = 1;
cout << "===============case1================" << endl;;
while (getline(cin, line))
{
string out, x;
stringstream ss(line);
while (ss >> x)
{
cout << x << ";";
}
++k;
cout << endl;
cout << "===============case" << k << "================" << endl;;
}
return 0;
}
输出:
===============case1================
this is very good!
this;is;very;good!;
===============case2================
this,is,very,good!
this,is,very,good!;
===============case3================
实验矩阵类型的输入:
3
0 1 2
2 3 4
5 6 7
int main()
{
string line;
int k = 1;
//测试矩阵形式的输入:
string input;
int n;
//cin >> n; //输入n行数据,如果后面用getline()后面的换行符不能处理
getline(cin, input);
stringstream ss(input);
ss >> n;
vector<vector<int> > vec;
for (int i = 0; i < n;i++)
{
getline(cin,input); //会将换行符当做一行
stringstream ss(input);
int x;
vector<int> temp;
while (ss>>x) //只能以空格处理分离
{
temp.push_back(x);
}
vec.push_back(temp);
}
return 0;
}
使用方法:
- input1是没有空格的,带有,;将矩阵的行列分出来;
- 但是使用cin>>k后,没有使用getline(input1), 应为input1本身是没有空格的字符串
经上面启发:练习这样的输入:
3 3
0,1 0,2;0,0 1,0;0,1 1,1;0,2 1,2;1,0 1,1;1,1 1,2;1,1 2,1;1,2 2,2;2,0 2,1
测试代码:
int main()
{
string line;
int k = 1;
int row, col;
getline(cin, line);
stringstream ss(line);
ss >> row >> col;
getline(cin, line); //第二行
stringstream s(line);
string temp1, temp2, temp3;;
vector<pair<pair<int,int>,pair<int,int>>> vec;
while (getline(s, temp1, ';'))
{
vector<pair<int, int>> pair1;
stringstream s3(temp1);
while (getline(s3, temp2,' ')) //以换行符结束,中间为空格
{
pair<int, int> pair2;
stringstream s4(temp2);
vector<int> res;
while (getline(s4, temp3, ','))
{
res.push_back(stoi(temp3));
}
pair2.first = res[0];
pair2.second = res[1];
pair1.push_back(pair2);
}
vec.push_back(make_pair(pair1[0],pair1[1]));
}
return 0;
}
输出:
另外参考输入遇到过问题题解:
5 0
1 2 3
0 4
0 4
0 4
1 2 3
int main()
{
int N, id;
string str;
getline(cin, str);
stringstream ss(str);
ss >> N >> id;
vector<vector<int>> vec;
//for (int i = 0; i < N; i++)
//{
// vector<int> temp;
// int user;
// getline(cin, str);
// stringstream s(str);
// while (s>>user) //以空格进行划分
// {
// temp.push_back(user);
// }
// vec.push_back(temp);
/
本文标题为:C++ stringstream格式化输出输入详情
基础教程推荐
- 详解c# Emit技术 2023-03-25
- 一文带你了解C++中的字符替换方法 2023-07-20
- 如何C++使用模板特化功能 2023-03-05
- C利用语言实现数据结构之队列 2022-11-22
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- C语言 structural body结构体详解用法 2022-12-06
- C++详细实现完整图书管理功能 2023-04-04
- C++中的atoi 函数简介 2023-01-05
- C/C++编程中const的使用详解 2023-03-26
- C语言基础全局变量与局部变量教程详解 2022-12-31