当前位置: 首页 > backend >正文

C++string类使用大全

目录

温馨提示:这篇文章有约两万字

什么是string类?

一. 定义和初始化string对象

1.string的构造函数的形式:

2.拷贝赋值运算符 

3.assign函数

二.string对象上的操作

1.读写string对象

2.读取未知数量的string对象

3.使用getline 读取一整行

 4.string对象的大小和容量:

​编辑

4.1string::size_type类型

5.string的字符串比较

5.1用关系运算符

5.2用compare函数

​编辑

6.string的加法

6.1两个string对象相加

6.2字面值和string对象相加

7 元素访问

7.1下标访问

7.2at函数

8.substr操作

9.insert函数

10.append 和replace函数

11.string的搜索操作

12 string的遍历:借助迭代器 或者 下标法

13. string的删除:erase()

14、 string的字符替换:

15. string的大小写转换:

16、 string的查找:find

17、 string的排序:sort(s.begin(),s.end())

18、 string的分割/截取字符串:strtok() & substr()

数值的转换

string 和数值之间的转换


什么是string类?

在C++中,string是一个用于处理字符串的类,它属于C++标准库中的一部分。

string类提供了一种方便且安全的方式来处理字符序列,相比于C语言中的字符数组(即C-style strings)或字符指针,C++的string类提供了更多的功能和更好的安全性。

为标准库的一部分,string定义在命名空间std中。接下来的示例都假定已包含了下述代码:

#include <string>
using std::string;

一. 定义和初始化string对象

string对象可通过构造函数和拷贝赋值运算符来初始化string对象

我们可以先看看string的构造函数是如何初始化string对象的

1.1. string的构造函数的形式:

string str;//生成空字符串string s(str);//字符串s为str的副本string s(str, strbegin,strlen);
//将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值string s(cstr, char_len);
//以C_string类型cstr的前char_len个字符串作为字符串s的初值string s(num ,c);
//生成num个c字符的字符串string s(str, stridx);
//将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值

我们看个例子


#include <iostream>
#include <string>
using namespace std;void test1()
{
    string str1;               //生成空字符串
    string str2("123456789");  //生成"1234456789"的复制品
    string str3("12345", 0, 3);//结果为"123"
    string str4("0123456", 5);  //结果为"01234"
    string str5(5, '1');       //结果为"11111"
    string str6(str2, 2);      //结果为"3456789"    cout<<"str2:"<<str2<<endl;
    cout<<"str3:"<<str3<<endl;
    cout<<"str4:"<<str4<<endl;
    cout<<"str5:"<<str5<<endl;
    cout<<"str6:"<<str6<<endl;
}int main()
{
    test1();
    return 0;
}

特别注意: 

1.2. 拷贝赋值运算符 

string类型的对象可以直接相互赋值!!

string s1;
string s2=s1;//s2是s1的副本
string s3="hello";//s3是字面值"helo"的副本,除了那个空字符之外

1.3. assign函数

在C++的std::string类中,assign()函数用于给字符串赋值。这个函数有多种重载形式,可以接受不同类型的参数,以便从其他字符串、字符数组、单个字符或子字符串来分配内容。

以下是assign()函数的一些常见用法:

从另一个std::string对象赋值:

 std::string str1 = "Hello";  
 std::string str2;  
 str2.assign(str1); // str2 现在包含 "Hello" 

从C风格的字符串(字符数组)赋值:

 const char* cstr = "World";  
 std::string str;  
 str.assign(cstr); // str 现在包含 "World"

 从单个字符赋值,并指定重复次数:

 char ch = 'a';  
 std::string str;  
 str.assign(5, ch); // str 现在包含 "aaaaa" 

从另一个std::string的子字符串赋值:

 std::string str = "Hello, World!";  
 std::string subStr;  
 subStr.assign(str, 7, 5); // 从索引7开始,长度为5的子字符串,subStr 现在包含 "World" 

注意,在上面的例子中,子字符串的索引是从0开始的,并且长度参数指定了要复制的字符数(不包括结束的空字符)。

从迭代器范围赋值:

如果你的数据来自标准库容器(如std::vector或std::list),你可以使用迭代器来指定要复制的范围。但是,由于std::string本身不是基于迭代器的容器,这种用法并不常见。但如果你有一个字符类型的容器,并且想将其内容转换为std::string,这种方法可能会有用。

 std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};  
 std::string str;  
 str.assign(vec.begin(), vec.end()); // str 现在包含 "Hello" 

从初始化列表赋值(C++11及更高版本):

 std::string str;  
 str.assign({'a', 'b', 'c'}); // str 现在包含 "abc"  
 // 或者直接使用初始化列表构造函数  
 std::string anotherStr = {'d', 'e', 'f'}; // anotherStr 现在包含 "def" 

使用assign()函数可以灵活地给字符串分配新的内容,同时替换掉字符串中原有的内容。如果assign()函数接收的参数会导致新字符串的长度超过当前字符串的容量,那么std::string可能会重新分配内存以存储新的内容。

二.string对象上的操作

一个类除了要规定初始化其对象的方式外,还要定义对象上所能执行的操作。

其中,类既能定义通过函数名调用的操作,下面列举了string的大多数操作。

os<<s
//从is中读取字符串赋给s,字符串以空白分隔,返回isis>>s
//从is中读取一行赋给s,返回isgetline(is,s)
//从is中读取一行赋值给s,返回iss.empty()
//s为空返回true,否则返回falses.size()
//返回s中字符的个数s[n]
//返回s中第n个字符的引用,位置n从0计起s1+s2 
//返回s1和s2连接后的结果sl=s2 
//用s2的副本代替s1中原来的字符s1==s2 
s1!=s2
//如果s1和s2中所含的字符完全一样,则它们相等;string对象的相等性判断对字母的大小写敏感<,<=,>,
//利用字符在字典中的顺序进行比较,且对字母的大小写敏感

2.1. 读写string对象

我们可以使用标准库中的iostream来读写int、double等内置类型的值。同样,也可以使用IO操作符读写string对象:

注意:要想编译下面的代码还需要适当的#include 语句和using声明

int main()
{
string s;//空字符串cin >>s;//将string对象读入s,遇到空白停止cout << s << endl;//输出s
return 0;
}

这段程序首先定义一个名为s的空string,然后将标准输入的内容读取到s中。在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止。

如上所述,如果程序的输入是

    Hello World!

则输出将是

 Hello

输出结果中没有任何空格。

和内置类型的输入输出操作一样,string对象的此类操作也是返回运算符左侧的运算对象作为其结果。因此,多个输入或者多个输出可以连写在一起:

string s1, s2;
cin >>s1 >> s2;// 把第一个输入读到 s1中,第二个输入读到 s2中
cout << sl << s2 << endl;
//输出两个string对象

假设给上面这段程序输入与之前一样的内容

      Hello World!

输出将是

HelloWorld!

这⾥我们可以发现,其实 cin 的⽅式给 string 类型的字符串中输⼊数据的时候,可以输⼊不带空 格的字符串。但是如果带有空格,遇到空格也就读取结束了,没有办法正常读取,那怎么办呢?解决 办法就是使⽤ getline

2.2. 使用getline 读取一整行

        有时我们希望能在最终得到的字符串中保留输入时的空白符,这时应该用getline函数代替原来的>>运算符。

        getline 是C++标准库中的⼀个函数,⽤于从输⼊流中读取⼀⾏⽂本,并将其存储为字符串。 getline 函数有两种不同的形式,分别对应着字符串的结束⽅式。

感兴趣的可以去这里看看:getline (string) - C++ Reference

我们先讲讲第一种getline

第⼀种 getline 函数以换⾏符( '\n' )作为字符串的结束标志,它的⼀般格式是:

 getline(cin, string str)//cin -- 表⽰从输⼊流中读取信息//str 是存放读取到的信息的字符串

        getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到那个string对象中去(注意换行符不被存进string对象)

        getline只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符也是如此。如果输入真的一开始就是换行符,那么所得的结果是个空string。

        和输入运算符一样,getline 也会返回它的流参数。因此既然输入运算符能作为判断的条件,我们也能用getline的结果作为条件。

例如,可以通过改写之前的程序让它一次输出一整行,而不再是每行输出一个词了:

因为line中不包含换行符,所以我们手动地加上换行操作符。和往常一样,使用endl结束当前行并刷新显示缓冲区。

触发getline函数返回的那个换行符实际上被丢弃掉了,得到的string对象中并不包含该换行符。

第二种getline

第⼆种 getline 函数允许⽤⼾⾃定义结束标志,它的⼀般格式是:

getline(cin, string str, char delim)//cin -- 表⽰从输⼊流中读取信息//str 是存放读取到的信息的字符串//delim 是⾃定义的结束标志

 函数从输入流中读取文本,直到遇到用户指定的结束标志字符(delim),然后将读取到的文本(不包括结束标志字符)存储到指定的string类型变量str中。

 2.3. size()和length()

  • size()和length():返回string对象的字符个数,他们执行效果相同。
http://www.xdnf.cn/news/11201.html

相关文章:

  • 基于51单片机的恒温控制系统设计
  • session.setAttribute和session.getAttribute
  • L7805CV-ASEMI三端稳压管L7805CV
  • 多图详细教你注册Google(Gmail)新账号,常见问题和注意事项
  • 以ATTCK为例构建网络安全知识图
  • 网络安全(黑客)2024小白自学必看
  • Matlab学习——求解微分方程(组)
  • 【实用党】推荐几款实用的AI工具
  • Android游戏开发之旅View类详解自定义View的常用方法:onFinishInflate
  • JDK6 新特性
  • micro SD(TF)卡详解
  • pure virtual function call--虚函数调用的错误
  • MPP文件怎么打开?五种方法总有最合适!
  • 搭建免费的ftp服务器
  • 别人总结的英语网站大全
  • uploadify 火狐 php,ThinkPHP 解决使用uploadify 在Firefox浏览器上传图片出现HTTP 500报错...
  • C++使用CriticalSection前需要先初始化
  • ResultSetMetaData用法介绍
  • mysql2005中文版_SQL Server 2005 sp4 简体中文完整免费版下载
  • 去AV片马赛克,开发者被抓了
  • 轻论坛StartBBS、YouBBS、Xiuno对比
  • C++表达式括号匹配
  • 安卓(Android) 刷机教程(任何机型、小米、华为等等)
  • #Linux存储的基本管理
  • Android定时器:实现定时的几种方法
  • 一刀999?怎样让你的 iPhone 手游也拥有开挂般的体验
  • 这是我见过最全的权限系统设计方案!
  • 一文读懂AlphaGo Zero算法
  • JRTPLIB使用实例
  • 颜色代码大全