C++字符串处理:string类的使用详解
C++字符串处理:string类的使用详解
在C++编程中,字符串处理是一项基本且重要的技能。本文将详细介绍C++中string类的使用方法,包括定义与初始化、转换为C风格字符串、输入输出、访问和修改字符、字符串拼接以及增删改查等操作。本文适合C++初学者阅读。
在C++中,字符串的处理是一项基本且重要的任务,无论是开发简单的应用程序还是复杂的软件系统,都离不开字符串的运用。C++提供了两种处理字符串的方式:C风格的字符串和C++风格的字符串。C风格的字符串本质上是一个以空字符\0
结尾的字符数组,而C++风格的字符串则是通过string
类实现的,后者提供了更强大和便捷的功能,使得字符串操作更加高效和安全。本文将深入探讨C++中string
类的使用方法及其提供的各种功能。
定义与初始化
使用string
类需要包含头文件<string>
,下面的例子介绍了几种定义string
变量(对象)的方法:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1;
string s2 = "c plus plus";
string s3 = s2;
string s4(5, 's'); // 由5个's'字符组成的字符串
return 0;
}
变量s1
只是定义但没有初始化,编译器会将默认值赋给s1
,默认值是""
,也即空字符串。
变量s2
在定义的同时被初始化为"c plus plus"
。与C风格的字符串不同,string
的结尾没有结束标志'\0'
。
变量s3
在定义的时候直接用s2
进行初始化,因此s3
的内容也是"c plus plus"
。
变量s4
被初始化为由5个s
字符组成的字符串,也就是"sssss"
。
从上面的代码可以看出,string
变量可以直接通过赋值操作符=
进行赋值。string
变量也可以用C风格的字符串进行赋值,例如,s2
是用一个字符串常量进行初始化的,而s3
则是通过s2
变量进行初始化的。
与C风格的字符串不同,当我们需要知道字符串长度时,可以调用string
类提供的length()
函数。如下所示:
string s = "Hello world!";
int len = s.length();
cout << len << endl;
输出结果为12
。由于string
的末尾没有'\0'
字符,所以length()
返回的是字符串的真实长度,而不是长度+1。
转换为C风格的字符串
虽然C++提供了string
类来替代C语言中的字符串,但是在实际编程中,有时候必须要使用C风格的字符串(例如打开文件时的路径),为此,string
类为我们提供了一个转换函数c_str()
,该函数能够将string
字符串转换为C风格的字符串,并返回该字符串的const指针(const char*)。请看下面的代码:
string path = "E:\\demo.txt";
FILE *fp = fopen(path.c_str(), "rt");
为了使用C语言中的fopen()
函数打开文件,必须将string
字符串转换为C风格的字符串。
字符串的输入输出
string
类重载了输入输出运算符,可以像对待普通变量那样对待string
变量,也就是用>>
进行输入,用<<
进行输出。请看下面的代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
cin >> s; // 输入字符串
cout << s << endl; // 输出字符串
return 0;
}
运行结果:
abc def↙
abc
虽然我们输入了两个由空格隔开的单词,但是只输出了一个,这是因为输入运算符>>
默认会忽略空格,遇到空格就认为输入结束,所以最后输入的"def"没有被存储到变量s
。
访问和修改字符串中的字符
string
字符串也可以像C风格的字符串一样按照下标来访问其中的每一个字符。string
字符串的起始下标仍是从0开始。请看下面的代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s = "1234567890";
for(int i = 0, len = s.length(); i < len; i++){
cout << s[i] << " ";
}
cout << endl;
s[5] = '5';
s.at(6) = '5';
cout << s << endl;
return 0;
}
运行结果:
1 2 3 4 5 6 7 8 9 0
1234555890
本例定义了一个string
变量s
,并赋值"1234567890",之后用for循环遍历输出每一个字符。借助下标运算符[]
或at()
方法,除了能够访问每个字符,也可以修改每个字符。
s[5] = '5';
将第6个字符修改为'5',s.at(6) = '5';
将第7个字符修改为'5',所以s
最后为"1234555890"。需要注意的是,at()
方法在索引超出范围时会抛出异常,而[]
则不会进行边界检查,因此,在不确定索引是否有效时,推荐使用at()
。
字符串的拼接
有了string
类,我们可以使用+
或+=
运算符来直接拼接字符串,非常方便,再也不需要使用C语言中的strcat()
、strcpy()
、malloc()
等函数来拼接字符串了,再也不用担心空间不够会溢出了。
用+
来拼接字符串时,运算符的两边可以都是string
字符串,也可以是一个string
字符串和一个C风格的字符串,还可以是一个string
字符串和一个字符数组,或者是一个string
字符串和一个单独的字符。请看下面的例子:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1 = "first ";
string s2 = "second ";
char *s3 = "third ";
char s4[] = "fourth ";
char ch = '@';
string s5 = s1 + s2;
string s6 = s1 + s3;
string s7 = s1 + s4;
string s8 = s1 + ch;
cout << s5 << endl << s6 << endl << s7 << endl << s8 << endl;
return 0;
}
运行结果:
first second
first third
first fourth
first @
字符串的增删改查
C++提供的string
类包含了若干实用的成员函数,大大方便了字符串的增加、删除、更改、查询等操作。
(1)插入字符串
insert()
函数可以在string
字符串中指定的位置插入另一个字符串,它的一种原型为:
string& insert (size_t pos, const string& str);
pos
表示要插入的位置,也就是下标;str
表示要插入的字符串,它可以是string
字符串,也可以是C风格的字符串。
请看下面的代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1, s2, s3;
s1 = s2 = "1234567890";
s3 = "aaa";
s1.insert(5, s3);
cout << s1 << endl;
s2.insert(5, "bbb");
cout << s2 << endl;
return 0;
}
运行结果:
12345aaa67890
12345bbb67890
insert()
函数的第一个参数有越界的可能,如果越界,则会产生运行时异常。
(2)删除字符串
erase()
函数可以删除string
中的一个子字符串。它的一种原型为:
string& erase (size_t pos = 0, size_t len = npos);
pos
表示要删除的子字符串的起始下标,len
表示要删除子字符串的长度。如果不指明len
的话,那么直接删除从pos
到字符串结束处的所有字符(此时len = str.length - pos
)。
代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1, s2, s3;
s1 = s2 = s3 = "1234567890";
s2.erase(5);
s3.erase(5, 3);
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
return 0;
}
运行结果:
1234567890
12345
1234590
不需要担心len
参数过大导致要删除的子字符串越界的情况,待删除字符串最多只能删除到字符串结尾。