C++中string字符串和stringstream流的用法详解

1 篇文章 7 订阅

前言

这是本人在学习C++过程中,发现 string 的用法繁多且杂乱,于是不断搜索各种资源,最后整理出的一篇自己的心得。

正文

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(){
    int n1 = 4567;
    string s1("1234567890abcdefg");
    
    string s2 (s1,3,4) ;    //从s1的下标3(第四个字符)开始,复制4个字符到s2;
    string s3 (3,'c') ;
    string s4 (s1,5) ;
    string s5 = s3;
    
    string input("Input test 123 4.7 A");
    stringstream inputString(input);
    string string1, string2;
    int i;
    double d;
    char c;
    inputString >> string1 >> string2 >> i >> d>>c; //>>会改变迭代器的位置,但不会减少stringstream中的内容。
    cout << "0 " << inputString.str() <<endl;
    
    
    string str1("How are you? 123 1 4.368");
    string str2;

    stringstream ss1;
    
    ss1<<s1<<" "<<s2;   // <<会改变迭代器的位置
    ss1.str(str1);  //  每次使用ss1.str()后,迭代器的位置置零;
    ss1<<" "<<s3<<" "<<s4;
    cout<<"1 "<<"ss1.str(): "<<ss1.str()<<endl;
    ss1<<s4<<" "<<s2<<" "<<s3<<" "<<s1;
    cout<<"2 "<<"ss1.str(): "<<ss1.str()<<endl;
    
    getline(cin,s4);

    stringstream ss(str1);  //构造函数初始化,stringstream通常用来做数据转换,更安全、自动和直接.
    
    ss<<n1;
    cout<<"3 "<<"ss.str(): "<<ss.str()<<endl;
    ss.str(str1);
    ss<<"test";
    cout<<"3.1 "<<"ss.str(): "<<ss.str()<<endl;
    
    for(int i=0;i<3;i++){
        ss>>str2;
        cout<<i+4<<" "<<"ss.str(): "<<ss.str()<<endl;
        cout<<"str2: "<<str2<<endl;
    }
    cout<<endl;
    
    cout<<"7 "<<"s1.length(): "<<s1.length()<<endl;
    ss.clear();
    s1.clear();
    cout<<"8 "<<"s1: "<<s1<<endl;
    cout<<"9 "<<"s1.length(): "<<s1.length()<<endl;
    
    cout<<"10 "<<"ss.str(): "<<ss.str()<<endl;
    ss.str("I am fine!");   //重新赋值
    while(ss>>str2){    //不断读取
        cout<<"ss.str(): "<<ss.str()<<endl;
        cout<<"str2: "<<str2<<endl;
    }
    cout<<endl;
    
    const string s=ss.str();// 将stringstream流中的数据以string字符串的形式表现,这样会有一个string拷贝的过程
    /*或*/ const string &s=ss.str(); //直接引用临时变量ss.str(),相当于延长其生命周期,使其生命结束时刻与字符串常量引用s一样
    ss.str("456"); //以字符串为参数,清空stringstream流中的数据并重新赋值;str重新赋值为456。
    ss.clear(); //清空字符串流的状态;
    ss.str(""); //字符串流清空数据并清除内存。
    s1.clear(); //字符串清空数据,并清除内存。
    s1.c_str(); //返回传统的char * 类型字符串,并在末尾添加一个null('\0')结束符。
    s1.data(); //返回传统的char * 类型字符串,但在末尾不添加'\0'。
    s1.copy(s2,2,0);// 赋值传统的char*字符串;从s1的下标0开始,以char*类型字符串的形式赋值2个字符给s2,返回赋值的实际字符个数。
    string str("szu");
    auto str11 = str.substr(2, 5); //截取字符串,从str的下标2开始,连续5个字符
    string str2_("深圳大学");
    auto str2_len = str2_.length(); //一个汉字占三个字节
    str2_.resize(str2_len / 3);
    s1.length(); //求字符串长度,遇到空字符不会截断;strlen()遇到空字符会截断。
    /*或*/ ss.str().length();//求当前字符串流的长度(先将字符串流进行sting字符串化,再用string的成员函数求其长度)
    s1.size(); //等同于s1.length();
    s1.resize(3);// 改变字符串容量大小。
    s1.find(s2);// 查找字符串,返回s2的首字符下标pos;若找不到,则返回string::npos(string中定义的静态常量);
    /*或*/ s1.find(s2,1);// 从s1的下标1开始查找s2;
    s1.rfind(s2); //从后向前查找,其余同上。
    s1.substr(1,2); //字符串从下标1开始,截取2个字符。
    s1.find_first_of(s2);// 查找字符串中的任一字符,返回s2中任一字符在s1第一次出现的下标;若找不到返回string::npos。
    s1.find_last_of(s2); //从后向前查找,其余同上
    s1.find_first_not_of(s2);// 查找不在字符串中的任一字符。返回不在s2的任一字符在s1第一次出现下标;若找不到返回string::npos
    s1.find_last_not_of(s2); //从后向前查找,其余同上。

    s1.assign(s2,2,3);// 赋值字符串(复制字符串),从s2的下标2(第二个??)开始,复制3个字符到s1中
    s1.at(2);// 返回单个字符的引用,检查是否超出范围,如果超出范围,会抛出out_of_range异常;
    s1.back();//字符串最后一个字符的引用
    s1[2]; //输出单个字符,但不检查是否超出范围;
    s1.append(s2); /*或*/ s2.append(s3, 3,s3.size()); //连接字符串; 从s3的下标3开始,复制s3.size()个字符连接到s2尾部
    s1.compare(s2); /*或*/ s1.compare(1,2,s2,1,2); /*或*/ s1.compare(1,s2,1,2); //或…… 比较字符串

    s1.swap(s2);// 交换字符串;
    s1.erase(5); /*或*/ s1.erase(5,2); /*或*/ s1.erase(iter);// 删除字符串,字符串内下标5及之后的字符(删除字符串从下标5开始的连续2个字符),删除字符串内iter所指向的字符。
    s1.empty();//判断字符串是否为空
    s1.pop_back();//删除最后一个字符
    s1.push_back(‘a’);//在最后添加一个字符
    s1.replace(2,3,s2); //替换字符串;将s1中从下标2开始的3个字符换成s2
    /*或*/ s1.replace(2,3,s2,1,2);// 将s1中下标2开始的3个字符换成s2从下标1开始的2个字符
    s1.insert(pos,s2);// 插入字符串;将s2插入s1下标pos的位置
    /*或*/ s1.insert(pos1,s2,pos2,size2);// 将s2中从下标pos2开始的size2个字符插入s1下标pos1的位置
    string s1 = to_string(num); //数字转字符串
    int num = stoi(s1,pos,radix);// 字符串转数字,在s1的下标pos开始直到末尾的radix进制转化为10进制
    
    s1 = "hello";
    s2 = " world";
    s1 += s2;   //正确,s1的值为" hello world "
    s1 += "world";  // 正确,s1的值为"hello world "
    s1 += 'c';  //正确,s1的值"helloc“
    //注:以上加号两边至少有一个string类型的对象,错误示例:s1="hello"+"world";
    
    s1.assign("testing iterators");
    for (string::const_iterator i1 = s1.begin(); i1 != s1.end(); ++i1 ){    //因为i1是迭代器,最好使用前置++或前置--,即使用++i1,而不是i1++;
        cout << *i1;
    }
    cout << endl;
//    字符串上的迭代器iterator相当于一个指针,某一时刻该指针指向字符串上的一个字符;
//    该指针可以通过+-操作移动位置,从而指向字符串不同的字符。
//    可以把string::const_iterator看作一种数据类型,用它可以定义字符串上的迭代器变量,用来在字符串中的字符间游走。
//    s1.begin()和s1.end()返回值类型为const_iterator,分别为字符串的第一个和最后一个,i1++实现迭代器的移动。
}

如果觉得帮到你的话,别忘了点赞哦

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值