string和stringstream

多功能的string.

string的本质

模板类

string类的函数:

string和容器很像,

函数作用
begin()
end()
push_back()注意string没有push_front()
back()
front()
to_string()不是string成员函数,可以转换正数,负数,小数。
stoi(),stof()...小数,负数也可以正常转换
反转

string没有内置的reverse函数。反转有两种方式:

1,reverse();

2,str.assign(str.rbegin(), str.rend());

3,s.assign(str.rend(),str.rbegin());为什么会段错误,rend()是第一个元素之前的位置,无。

push_back(char)注意:只能push字符,不能字符串
append(string)这个才能string
iterator insert(iterator,char)
size_t find(arg)arg可以是字符或者字符串

string的构造函数

1,string(char*)

2,string(std::string)

3,string(char*,int len)

第二个参数表示从起始的长度。

#include <iostream>

int main(){
    const char *c_str="abcdefgggg";
    std::string str=std::string(c_str,3);
    std::cout<<str<<std::endl;

    return 0;
}

4,string(std::string,int index)

第二个参数表示复制的开始索引,到最后。

#include <iostream>

int main(){
    const char* cc="abcdefghijk";
    std::string c_str=std::string(cc,3);
    std::cout<<c_str<<std::endl;
    std::string str="abcdefghijk";
    std::string later_str=std::string(str,3);
    std::cout<<later_str<<std::endl;
    std::string pre_str=std::string(str.c_str(),3);
    std::cout<<later_str<<std::endl;

    return 0;
}

如何比较两个string字符串:

1,string类可以用关系运算符进行比较:

比较的原则是:ASCII码大者为大         ,小写字母大于大写字母

        string str1="vdufbvf",s1="yhhhhuu";
        string str2="iwufvbdfv",s2="Yhhhuu";

        if(str1>str2)
                cout<<"str1>str2"<<endl;
        else if(str1<str2)
                cout<<"str1<str2"<<endl;

        if(s1>s2)
                cout<<"s1"<<s1<<endl;
        else if(s1<s2)
                cout<<"s2"<<s2<<endl;

2,

string类的compare函数:

compare返回0,1,-1

compare的参数可以是以下类型:

string str1="come here,dear.";
string str2="ok,I am going now.";

str2.compare(str1);// 1
str2.compare("you are late.");// 2
str2.compare(4,4,str1);// 3,将str2从4开始的4个字符与str1比较
str2.compare(4,4,str1,3,4);// 4,将str2从4开始的4个字符与str1从3开始的4个字符比较

char arr[]="oehdfcbfc";
str2.compare(arr);// 5
str2.compare(2,4,arr);// 6,原理同3
str2.compare(3,5,arr+n,4);// 7,将str2从3开始的5个字符和arr+n的地址开始的4个字符比较

如何从一个string字符串中抽取出需要的字符串:

substr函数:

string str="We will not seperate forever";
string s=str.substr(0);//拷贝str中的所有字符
string s=str.substr(3);//从w(注意小写的w)考试拷贝所有字符
string s=str.substr(5,10);//从地址为5个的地址拷贝10个字符

//当开始拷贝位置加上计数值大于str时,substr只会拷贝到结尾
//当开始拷贝的位置大于str的最大字节数时,程序报错

string的数值转换:

1,其他类型转string:

int n=10;

string s=to_string(n);

注意:to_string只能运用于任何算数类型,而不能用于char,char会变为Int再转伟string

string str("1982");
int num=stoi(str);

stoi会将数字字符之后的非数字字符除去,前面的不会。

如何将char转为string 

string中保存的就是char

string str;
str.push_back('a');

头文件

注意头文件----#include <string>

不是string.h也不是cstring

 那么如何将char类型转为string:

可以用string的构造方法:

其中要转换为数值的string对象中的第一个字符必须是数字

p,b参数可以不要,只要s.

如何判断string对象是否为空:

string类的empty函数:
string s;

s.empty();

empty函数返回一个bool类型

对string源对象字符串进行插入,删除,元素访问:

(如何连接字符串)

at(int index)

元素的访问可以用下标,或者at()函数,at()的参数也是下标。

replace

`std::string` 类型的 `replace()` 成员函数有三个版本:

1. `string& replace (size_t pos, size_t len, const string& str)`:

在字符串中从 `pos` 开始的 `len` 个字符会被替换为 `str`。

#include <iostream>

int main(){
    std::string str="I am an animal.";
    std::cout<<str<<std::endl;
    std::string animal="animal";
    if(str.find("animal")!=std::string::npos){
        int index=str.find(animal);
        str.replace(index,animal.size(),"person");
        std::cout<<str<<std::endl;
    }

    return 0;
}

2. `string& replace (iterator first, iterator last, const string& str)`:

将半开区间 `[first, last)` 内的字符替换为 `str`,其中 `first` 和 `last` 都是 `string` 类型的迭代器。

#include <iostream>

int main(){
    std::string str="I am an animal.";
    std::cout<<str<<std::endl;
    std::string animal="animal";
    if(str.find("animal")!=std::string::npos){
        int index=str.find(animal);
        str.replace(str.begin()+index,str.begin()+index+animal.size(),"person");
        std::cout<<str<<std::endl;
    }

    return 0;
}


3. `string& replace (size_t pos, size_t len, const char* s)`:

在字符串中从 `pos` 开始的 `len` 个字符会被替换为 C 风格的字符串 `s`。

怎么替换所有目标字符串

string的replace只能替换一次,替换所有需要循环。

#include <iostream>

int main(){
    std::string str="aa bb cc aa aa";
    std::cout<<str<<std::endl;
    std::string re="aa";
    while(str.find(re)!=std::string::npos){
        int index=str.find(re);
        str.replace(index,re.size(),"--");
    }
    std::cout<<str<<std::endl;
    return 0;
}

string的find函数

find有两个参数,第二个参数为开始查询的下班位置,默认为0.

链接

string s = "hello world!";
cout << s.find("l",5) << endl;

string的三个erase

非迭代器erase:

两个参数都是size_t类型,返回指向新字符串是字符串引用。

迭代器erase(两个):

所有的参数都是erase,返回迭代器。

链接

int和char的用'0'转换

int和char之间的转换,无非就是ASCLL码的转换。

其他的数字字母的ASCLL码都是‘0’的ASCLL码加上1,所以:

'0'的ASCLL码为48

char ch=1+'0'; //48+1=49;所以ch='1';

int num=ch-'0';//49-48=1,所以num=1;

stringstream

链接

本质

stringstream本质上是一个从输入输出继承而来的流。

有参数的构造函数和无参构造函数的调用区别

1,无参构造---之后添加的字符串都不会覆盖拼接;

2,有参构造---之后添加的字符串会覆盖构造时的字符串,但是注意,之后添加的所有字符串并不会覆盖,而是会拼接。

作用:

1,以空格作为默认分割字符串;

2,按照指定字符分割字符串;

默认空格分割字符串

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main() {
	string str = "1 left 2";
	stringstream ss(str);
	int num1, num2;
	string c;
	ss >> num1 >> c >> num2;  // 从 stringstream 中依次读取整数和字符

	cout << "num1 = " << num1 << endl;
	cout << "num2 = " << num2 << endl;
	cout << "c = " << c << endl;

	return 0;
}

指定特定字符分割

链接

#include <iostream>
#include <sstream>

int main(){
    std::string str{"a,b,c,d"};
    std::stringstream ss{str};
    std::string member;
    while(getline(ss,member,',')){
        std::cout<<member<<std::endl;
    }

    return 0;
}

stringstream进行小数精度输出

四舍五入

#include <iostream>
#include <sstream>
#include <iomanip>

int main(){
    std::stringstream ss;
    double f=1.11161;
    ss<<std::fixed<<std::setprecision(3)<<f;
    std::cout<<ss.str()<<std::endl;
    return 0;
}

从字符串中提取单词

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::string content = "const int variable1 [10]; const char var2 [100]";

    std::regex r("(const\\s+)(\\w+\\s+)(\\w+[0-9]+\\s+)");
    const std::sregex_iterator end;
    for (std::sregex_iterator iter(content.begin(), content.end(), r); iter!=end; iter++)
    {
        std::cout << "(*iter)[0]=" << (*iter)[0]<< std::endl;
        std::cout << "iter->str="<<iter->str() << std::endl;
        std::string res=iter->str();
        std::stringstream ss(res);
        std::string con,var,name;
        ss>>con>>var>>name;
        std::cout<<con<<var<<name<<std::endl;
    }
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]: stringstream主要是用在将一个字符串分割,可以先用clear()以及str()将指定字符串设置成一开始的内容,再用>>把个别的资料输出。\[1\]这个函数可以将字符串中的数据按照指定的格式提取出来,比如将字符串中的数字提取出来赋值给变量。引用\[3\]: stringstream是字符串流,经常被用来作数据切分或者类型转化。\[3\]它可以将字符串转化为其他类型的数据,比如将字符串转化为整数或浮点数。引用\[2\]: stringstream还可以用来将其他类型的数据转化为字符串。\[2\]比如将整数转化为字符串,可以使用stringstream的<<操作符将整数写入stringstream对象,然后使用str()函数获取转化后的字符串。 所以,stringstream是一个用于字符串和其他类型数据之间的转换的工具。它可以将字符串分割成多个部分,也可以将其他类型的数据转化为字符串。 #### 引用[.reference_title] - *1* *3* [C++stringstringstream用法总结](https://blog.csdn.net/u011028345/article/details/75449169)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [stringstringstream用法](https://blog.csdn.net/sunshineacm/article/details/78068987)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值