- 谁是赢家
- 2022-08-08 11:26:17 @
\(\text{stringstream}\)食用方法
1.前言
在 \(\text{C}\) 语言中,如果想要将一个整形变量的数据转化为字符串格式,可以使用下面的方法:
1. 使用 \(\text{itoa()}\)函数
2. 使用 \(\text{sprintf()}\) 函数
但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。
#include <iostream>
using namespace std;
int main()
{
int n = 123456789;
char s1[32];
itoa(n, s1, 10);//最后一个参数表示需要多少空间
char s2[32];
//sprintf就是相当于将打印到屏幕的字符串打印到用户给的空间
sprintf(s2, "%d", n);
char s3[32];
sprintf(s3, "%f", n);//将int转换成浮点数的时候会出错(把n这个空间看成浮点数)
return 0;
}
2.\(\text{stringstream}\)
在 \(\text{C++}\) 中,我们可以使用 \(\text{stringstream}\)类对象来避开此问题。在程序中如果想要使用\(\text{stringstream}\),必须要包含头文件 #include<sstream>
。在该头文件下,标准库包含三个类:\(\text{istringstream}\)、\(\text{ostringstream}\) 和 \(\text{stringstream}\),分别用来进行流的输入、输出和输入输出操作。
\(\text{stringstream}\) 的主要用法如下:
\(1.\) 将数值类型数据格式化为字符串。
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
#include<sstream>
int main()
{
int a = 12345678;
string sa;
// 将一个整形变量转化为字符串,存储到string类对象中
stringstream s;
s << a;
s >> sa;
// 将stringstream底层管理string对象设置成"",
// 否则多次转换时,会将结果全部累积在底层string对象中
s.str("");
s.clear();// 清空s, 不清空会转化失败
double d = 12.34;
s << d;
s >> sa;
string sValue;
//这个方法会把管理的整个string对象返回,不会受读/写指针的影响
sValue = s.str();// str()方法:返回stringsteam中管理的string类型
cout << sValue << endl;
return 0;
}
\(2.\) 字符串拼接。
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
#include<sstream>
int main()
{
stringstream sstream;
// 将多个字符串放入 sstream 中
sstream << "first" << " " << "string,";
sstream << " second string";
cout << "strResult is: " << sstream.str() << endl;
// 清空 sstream
sstream.str("");
sstream << "third string";
cout << "After clear, strResult is: " << sstream.str() << endl;
return 0;
}
输出结果:
\(3.\) 用 \(\text{stringstream}\) 可以用指定字符分割字符串。
#include <iostream>
#include <sstream>
#include <vector>
#include <queue>
using namespace std;
int main() {
std::string data = "1_2_3_4_5_6";
std::stringstream ss(data);
std::string item;
queue<string> q;
cout << data << endl;
while (std::getline(ss, item, '_'))
cout << item << ' ';
}
输出结果:
3.总结
- \(\text{stringstream}\) 实际是在其底层维护了一个 \(\text{string}\) 类型的对象用来保存结果。
- 多次数据类型转化时,一定要用 \(\text{clear()}\) 来清空,才能正确转化,但 \(\text{clear()}\) 不会将 \(\text{stringstream}\) 底层的 \(\text{string}\) 对象清空。
- 可以使用 \(\text{s. str(“~”)}\) 方法将底层 \(\text{string}\) 对象设置为空字符串。
- 可以使用 \(\text{s.str()}\) 将让 \(\text{stringstream}\) 返回其底层的 \(\text{string}\) 对象。
- \(\text{stringstream}\) 使用 \(\text{string}\) 类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。
0 条评论
目前还没有评论...