stringstream食用方法

\(\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.总结

  1. \(\text{stringstream}\) 实际是在其底层维护了一个 \(\text{string}\) 类型的对象用来保存结果。
  2. 多次数据类型转化时,一定要用 \(\text{clear()}\) 来清空,才能正确转化,但 \(\text{clear()}\) 不会将 \(\text{stringstream}\) 底层的 \(\text{string}\) 对象清空。
  3. 可以使用 \(\text{s. str(“~”)}\) 方法将底层 \(\text{string}\) 对象设置为空字符串。
  4. 可以使用 \(\text{s.str()}\) 将让 \(\text{stringstream}\) 返回其底层的 \(\text{string}\) 对象。
  5. \(\text{stringstream}\) 使用 \(\text{string}\) 类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。

0 条评论

目前还没有评论...

信息

ID
1475
难度
7
分类
博弈论 点击显示
标签
递交数
1
已通过
1
通过率
100%
上传者