首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >string 深入(一)

string 深入(一)

作者头像
散峰而望
发布2025-12-23 12:51:31
发布2025-12-23 12:51:31
1800
举报

前言

前面介绍了通过字符数组保存字符串,然后对字符数组中的字符串做各种操作

代码语言:javascript
复制
char str[20] = "hello world";

为了更加简单方便,在 C++ 中,又增加了 string 来处理字符串。

string 字符串其实是一种更加高级的封装,string 字符串中包含大量的方法,这些方法使得字符串的操作变得更加简单。string 使用的好,慢慢你就不想使用字符数组来存放字符串了。所以这一章要好好的理解并且能够更好的使用 string。

1. string 概念

什么是string呢?

而 C++ 中将字符串直接作为一种类型,也就是 string 类型,使用 string 类型创建的对象就是 C++ 的字符串。

代码语言:javascript
复制
string s1;
string s2 = "abc";

使用 C++ 中提供的 string 时,必须添加头文件 < string >

2. string 常见操作

string 文档https://legacy.cplusplus.com/reference/string/string/

2.1 创建字符串

方式

解释

string s1

创建空字符串

string s2 = “hello world”

创建字符串(常用)

代码示例:

代码语言:javascript
复制
#include <iostream>
using namespace std;
#include <string>

int main()
{
    string s1;
    string s2 = "hello world";
    cout << "s1:" << s1 << endl;    
    cout << "s2:" << s2 << endl;    
    return 0; 
}

结果演示:

创建字符串的方式与前面学习到创建内置数据类型的方式相同,只是这里的字符串类型为 string。

  1. string s1 表示创建空字符串,相当于创建整型 int a,但未给 a 一个初始值。
  2. string s2 = “hello world” 表示创建一个字符串 s2,它的内容是" hello world ",要 注意 s2 中的字符串不再以 \0 作为结束标志了。(C 语言中的字符串是以 \0 作为结束标志的)。
在这里插入图片描述
在这里插入图片描述

上面这个图,仅仅是字符串 s2 的示意图,实际上 string 类型的字符串比这个要复杂的多,更多的知识得学习 C++ 的类和对象的知识才能明白。

除了以上创建字符串的写法外,C++ 中还有一些其他的创建字符串方式。如:

代码语言:javascript
复制
string s("hello world"); //等同于string s1 = "hello world"; 
string s1 = s; //用一个现成的字符串s,初始化另外一个字符串s1

演示结果:

在这里插入图片描述
在这里插入图片描述

当然 C++ 中的 string 创建的字符串和 char 类型的数组所表示的字符串还有一个区别,string 类型的字符串对象可以直接赋值,比如:

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s1("hello world");
    string s2("hehe");
    s2 = s1;
    cout << s2 << endl;
    return 0;
}

演示结果:

在这里插入图片描述
在这里插入图片描述

但是如果是数组的话:

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;
int main()
{
    char arr1[] = "hello world";
    char arr2[] = "hehe";
    arr2 = arr1;
    cout << arr2 << endl;
    return 0;
}

演示结果:

在这里插入图片描述
在这里插入图片描述

会发现报错。这是因为数组名是首元素地址,地址是常量,不可改。

2.2 string 字符串的输入

2.2.1 cin 方式输入

可以直接使用 cin 给 string 类型的字符串中输入一个字符串的数据。

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    //输入 
    cin >> s;
    //输出 
    cout << s << endl;
    
    return 0;
}

输入不带空格的字符串:

在这里插入图片描述
在这里插入图片描述

输入带空格的字符串:

在这里插入图片描述
在这里插入图片描述

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

2.2.2 getline 的方式

getline 文档https://legacy.cplusplus.com/reference/string/string/getline/

getline 函数是 C++ 标准库中的一个函数,用于从输入流中读取一行文本,并将其存储为字符串。

getline 函数有两种不同的形式,分别对应着字符串的结束方式。

代码语言:javascript
复制
istream& getline (istream& is, string& str);
istream& getline (istream& is, string& str, char delim);

小提示: istream 是输入流类型,cin 是 istream 类型的标准输入流对象。 ostream 是输出流类型,cout是 ostream 类型的标准输出流对象。 getline 函数是输入流中读取一行文本信息,所有如果是在标准输入流(键盘)中读取数据,就可以传 cin 给第一个参数。

  • 第一种 getline 函数以换行符(‘\n’)作为字符串的结束标志,它的一般格式是:
代码语言:javascript
复制
getline(cin, string str)
//cin -- 表示从输入流中读取信息 
//str 是存放读取到的信息的字符串

这种形式的 getline 函数从输入流(例如 cin)中读取文本,直到遇到换行符(‘\n’)为止,然后将读取到的文本(不包括换行符)存储到指定的 string 类型的变量 str 中。

代码语言:javascript
复制
#include<iostream>
#include <string>
using namespace std;
int main ()
{
    string name;
    getline (cin, name);
    cout << name << endl;
    
    return 0;
}

演示结果:

在这里插入图片描述
在这里插入图片描述
  • 第二种 getline 函数允许用戶自定义结束标志,它的一般格式是
代码语言:javascript
复制
getline(cin, string str, char delim)
//cin -- 表示从输入流中读取信息 
//str 是存放读取到的信息的字符串 
//delim 是自定义的结束标志

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

代码语言:javascript
复制
#include<iostream>
#include <string>
using namespace std;
int main ()
{
    string name;
    getline (cin, name, 'e');
    cout << name << endl;
    
    return 0;
}

演示结果:

在这里插入图片描述
在这里插入图片描述

提示: 在使用 C++ 中的 string 字符串时,想要输入的字符串中包含空格,那么 getline 函数就是必须的。在竞赛中为了方便处理字符串,通常会使用 string 类型的字符串,所以在字符串输入的时候 getline 就很常见,建议认真学习。

2.3 size()

size() 文档https://legacy.cplusplus.com/reference/string/string/size/

string 中提供了 size() 函数用于获取字符串长度。 在 C++ 中关于字符串的操作函数都是包含在 string 中的,所以需要调用这些函数时,通常用 . 点运算符。

使用示例:

代码语言:javascript
复制
#include <iostream>
#include <string>      
using namespace std;
int main()
{
    string s;
    string s1 = "hello";
    string s2 = "hello world";
    string s3 = "12ab!~        "; 
    cout << "s:" << s.size() << endl;
    cout << "s1:" << s1.size() << endl;
    cout << "s2:" << s2.size() << endl;
    cout << "s3:" << s3.size() << endl;
    return 0;
}

演示结果:

在这里插入图片描述
在这里插入图片描述

小提示: 前面我们学到的像 char、int、double 等内置类型的数据在操作的时候,不会使 用.操作符的。 string 是 C++ 提供的一种更加复杂的封装类型,在 string 类型的变量中加入了操作这 个字符串的各种方法(函数),比如求字符串长度、字符串末尾插入一个字符等操作。所以要对 string 类型的变量进行各种操作,就可以使用.操作符来使用这些函数。 我们可以看下面的例子,大家要仔细体会。

通过 size() 能获得字符串的长度,顺便就可以使用这个长度遍历字符串的,注意 string 类型的字符串是可以通过下标访问的,比如:

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s = "abcdef";
    int i = 0;
    for(i = 0; i < s.size(); i++)
    {
        cout << s[i] << " ";
    }
    return 0;
}

演示结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4 迭代器(iterator)

iterator 的官方网址:https://legacy.cplusplus.com/reference/string/string/

在这里插入图片描述
在这里插入图片描述

迭代器是一种对象,它可以用来遍历容器(比如我们现在学习的string)中的元素,迭代器的作用类似于指针,或者数组下标。

访问迭代器指向的值,需要解引用(*)。到后面讲解到指针部分就明白了

C++ 中的 string 提供了多种迭代器,用于遍历和操作字符串中的内容。这里给大家介绍一种最常用的迭代器。

2.4.1 begin() 和 end()
  • begin():返回指向字符串第一个字符的迭代器,需要一个迭代器的变量来接收。
  • end():返回指向字符串最后一个字符的下一个位置的迭代器(该位置不属于字符串)。
  • string 中 begin() 和 end() 返回的迭代器的类型是 string::iterator
代码语言:javascript
复制
string s = "abcdef";
在这里插入图片描述
在这里插入图片描述

提示:

  • 迭代器是可以进行大小比较,也可以进行 + 或者 - 整数运算的。前面的迭代器 < 后面的迭代器 比如:it++,就是让迭代器前进一步,it-- 就是让迭代器退后一步。
  • 同一个容器的两个迭代器也可以相减,相减结果的绝对值,是两个迭代器中间元素的个数。 (这一部分属于指针部分,后面会详细讲)
代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s = "abcdef";
    string::iterator it1 = s.begin();
    string::iterator it2 = s.end();
    cout << (it1 < it2) << endl;
    cout << it1 - it2 << endl;
    return 0;
}

演示结果:

在这里插入图片描述
在这里插入图片描述

迭代器通常用于遍历字符串的,可以正序遍历,也可以逆序遍历。

正序遍历:

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s = "abcdef"; 
    //auto it 是让编译器自动推到it的类型 
    for (auto it = s.begin(); it != s.end(); ++it) 
    {     
        cout << *it << ' '; 
    }
    cout << endl;
    //string::iterator 是正向迭代器类型 
    //string::iterator it,是直接创建迭代器,it是针对字符串的迭代器 
    for (string::iterator it = s.begin(); it != s.end(); it++) 
    {     
        cout << *it << ' '; 
    }
    return 0;
}

演示结果:

在这里插入图片描述
在这里插入图片描述

逆序遍历:

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s = "abcdef"; 
    for (string::iterator it = s.end() - 1; it >= s.begin(); --it) 
    {     
        cout << *it << ' '; 
    }
    return 0;
}

演示结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过迭代器找到元素后,改变迭代器指向的元素,是可以直接改变字符串内容的。

代码语言:javascript
复制
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str = "abcdef"; 
    cout << str << endl;
    for (string::iterator it = str.begin(); it < str.end(); ++it) 
    {     
        *it = 'x'; 
    }
    cout << str << endl;
    return 0;
}

演示结果:

结语

占时就讲这么多,后面一章将对 string 相关内容全部讲完,并对以前的相关习题进行分析解答。

愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1. string 概念
  • 2. string 常见操作
    • 2.1 创建字符串
    • 2.2 string 字符串的输入
      • 2.2.1 cin 方式输入
      • 2.2.2 getline 的方式
    • 2.3 size()
    • 2.4 迭代器(iterator)
      • 2.4.1 begin() 和 end()
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档