欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++学习笔记——string详解

程序员文章站 2022-06-08 10:26:32
...

C++学习笔记系列

C++学习笔记——与地址相关的运算“*”和“&”关系.


前言

C++中采用string类可以很方便的使用字符串,同时也支持C语言风格的字符串。string 是 C++ 中常用的一个类,在使用 string 类需要包含头文件<string>。


一、string类对象的定义

C++可以支持用“=”对string类对象进行赋值,也支持用字符串常量对其进行初始化。

#include <iostream>
#include <string>//使用string类
using namespace std;
int main(){
    string s1;//仅定义,无初始化,赋默认值"",也就是空字符串
    string s2 = "c plus plus";//初始化为"c plus plus",结尾无'\0'
    string s3 = s2;//用s2对s3进行初始化
    string s4 (5, 's');//初始化为5个's'组成的字符串,"sssss"
    return 0;
}

二、求字符串的长度length()

string类提供的函数 length() 函数可以得到字符串的长度,而string类对象是不包括休止符’\0’的,length() 返回的是字符串的真实长度,而不是长度 +1。

string s = "http://c.biancheng.net";
int len = s.length();
cout<<len<<endl;//输出结果为22

三、与C语言相关的一些用法

1.转换为C语言风格的字符串c_str()

该函数将string字符串转换为C风格的字符串,并返回该字符串的const指针(const char*)

string path = "D:\\demo.txt";
FILE *fp = fopen(path.c_str(), "rt");

为了使用C语言中的 fopen() 函数打开文件,必须将 string 字符串转换为C风格的字符串。

2.大小写问题

string类的字符串对象是大小写敏感的,因此我们可以使用C语言中的大小写转换函数toupper和tolower来帮助我们解决string类的大小写问题。
记录一道在剑指上的题:
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字母,然后输出输入字符串中该字母的出现次数。不区分大小写。

#include<iostream>
#include<string>
using namespace std;
int main(){
    string s;
    char ch,ch0;
    int count = 0;
    getline(cin,s);
    cin>>ch;
    ch0=tolower(ch);
    ch=toupper(ch0);
    for(int i=0;i<s.length();i++){
        if(s[i]==ch||s[i]==ch0) count++;
    }
    cout<<count<<endl;
    return 0;
}

三.string字符串的输入和输出

1.cin和cout

string 类重载了输入输出运算符,可以像对待普通变量那样对待 string 变量,也就是用>>进行输入,用<<进行输出。

int main(){
    string s;
    cin>>s;  //输入字符串
    cout<<s<<endl;  //输出字符串
    return 0;
}

2.getline()

当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。
可以使用getline 的 C++ 函数解决这个问题。此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。

getline(cin, inputLine);
//cin是正在读取的输入流,而 inputLine 是接收输入字符串的 string 变量的名称

四.访问字符串中的字符

可以按照下标访问string字符串的每一个字符,起始下标从0开始。

string s="123456789";
cout<<s[5]<<endl;//输出为6
s[5]=5;//赋值后s="123455789"

五.字符串的拼接

用C++的string 类,我们可以使用+或+=运算符来直接拼接字符串。
用+来拼接字符串时,运算符的两边可以都是 string 字符串,也可以是一个 string 字符串和一个C风格的字符串,还可以是一个 string 字符串和一个字符数组,或者是一个 string 字符串和一个单独的字符。

int main(){
    string s1 = "first ";
    string s2 = "second ";
    char *s3 = "third ";
    char s4[] = "fourth ";
    char ch = '@';
    string s5 = s1 + s2;//s5="first second"
    string s6 = s1 + s3;//s6="first third"
    string s7 = s1 + s4;//s7="first fourth"
    string s8 = s1 + ch;//s8="first @"
    cout<<s5<<endl<<s6<<endl<<s7<<endl<<s8<<endl;
    return 0;
}

六.string字符串的增删改查

1.插入字符串insert()

insert() 函数可以在 string 字符串中指定的位置插入另一个字符串。

string& insert (int pos, const string& str);
//pos为插入的位置,str 表示要插入的字符串,它可以是 string 字符串,也可以是C风格的字符串。

2.删除子字符串erase()

erase()可以删除 string 中的一个子字符串。

string& erase (int pos = 0, size_t len = npos);
//pos表示要删除的子字符串的开始下标,len 表示要删除子字符串的长度
//如果不指明 len 的话,那么直接删除从 pos 到字符串结束处的所有字符,此时 len = str.length - pos

3.提取子字符串substr()

substr() 函数用于从 string 字符串中提取子字符串。

string& erase (int pos = 0, size_t len = npos);
//pos表示要提取的子字符串的开始下标,len 表示要提取子字符串的长度
//如果不指明 len 的话,那么直接提取从 pos 到字符串结束处的所有字符,此时 len = str.length - pos

4.字符串查找

①find()

find()用于查找子字符串的位置。

size_t find (const string& str, int pos = 0) const;
size_t find (const char* s, int pos = 0) const;

第一个参数为待查找的子字符串,它可以是 string 字符串,也可以是C风格的字符串。
第二个参数为开始查找的位置(下标);如果不指明,则从第0个字符开始查找。
若找不到,则返回一个无穷大的值4294967295。

②rfind()

rfind()也是用于查找子字符串的位置。
与find不同的是第二个参数表示的是查找到第二个参数为止的位置。
若找不到,则返回一个无穷大的值4294967295。

③find_first_of()

find_first_of()用于查找子字符串和字符串共同拥有的字符在字符串中首次出现的位置。

参考文献

[1] C++ string详解,C++字符串详解.
[2] C++ getline函数用法详解.
[3] C++对string进行大小写转换.