一、C++ 中的字符串表示形式
C++ 提供了以下两种字符串表示形式:
C 风格字符字符串
C 风格字符字符串起源于 C 语言,并且在 C++ 中继续得到支持。这种字符串实际上是一维的字符数组,以空字符 '\0' 结尾。因此,一个空终止字符串包含构成字符串的字符后面跟着一个空字符。
下面的声明和初始化创建了一个由单词 "Hello" 组成的字符串。为了在数组的末尾容纳空字符,包含字符串的字符数组的大小比单词 "Hello" 中的字符数量多一。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
如果你遵循数组初始化的规则,那么可以将上面的语句写为:
char greeting[] = "Hello";
以下是以上定义的字符串在 C/C++ 中的内存表示:
实际上,你不需在字符串常量的末尾放置空字符。C++ 编译器会在初始化数组时自动在字符串的末尾放置 '\0'。让我们尝试打印上述提到的字符串:
示例
#include <iostream>
using namespace std;
int main () {
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "问候消息: ";
cout << greeting << endl;
return 0;
}
当上述代码被编译并执行时,它产生如下结果:
问候消息: Hello
C 风格字符串函数
C++ 支持一系列操作空终止字符串的函数。这些函数定义在 <string.h>
头文件中。
序号 |
函数 & 目的 |
1 |
strcpy(s1, s2); |
2 |
strcat(s1, s2); |
3 |
strlen(s1); |
4 |
strcmp(s1, s2); |
5 |
strchr(s1, ch); |
6 |
strstr(s1, s2); |
示例
以下示例使用了上述提到的一些函数:
#include <iostream>
#include <cstring>
using namespace std;
int main () {
char str1[10] = "Hello";
char str2[10] = "World";
char str3[10];
int len ;
strcpy( str3, str1);
cout << "strcpy( str3, str1) : " << str3 << endl;
strcat( str1, str2);
cout << "strcat( str1, str2): " << str1 << endl;
len = strlen(str1);
cout << "strlen(str1) : " << len << endl;
return 0;
}
当上述代码被编译并执行时,它产生如下结果:
strcpy( str3, str1) : Hello
strcat( str1, str2): HelloWorld
strlen(str1) : 10
C++ 中的字符串类
标准 C++ 库提供了一个支持所有上述操作以及更多功能的字符串类类型。
字符串类示例
让我们检查以下示例:
#include <iostream>
#include <string>
using namespace std;
int main () {
string str1 = "Hello";
string str2 = "World";
string str3;
int len ;
str3 = str1;
cout << "str3 : " << str3 << endl;
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
}
当上述代码被编译并执行时,它产生如下结果:
str3 : Hello
str1 + str2 : HelloWorld
str3.size() : 10
二、创建字符串
我们可以使用以下两种方法之一来创建字符串变量:
使用字符数组创建字符串
我们可以使用 C 风格的字符数组来声明字符串。这是使用如下语法完成的:
char 变量名[数组长度];
这里的 数组长度
是字符数组的长度。
创建字符串的字符数组示例
在以下示例中,我们声明了一个字符数组,并给它赋值。
#include <iostream>
using namespace std;
int main() {
char s[5]={'h','e','l','l','o'};
cout<<s<<endl;
return 0;
}
输出:
hello
使用 <string>
创建字符串
我们可以使用 string
关键字来声明字符串变量。这包括在 <string>
头文件中。声明字符串的语法解释如下:
string 变量名 = [值];
这里的 [值]
是可选的,可以在声明时用来赋值。
创建字符串示例
在以下示例中,我们声明了一个字符串变量,并给它赋值。
#include <iostream>
using namespace std;
int main() {
string s="a merry tale";
cout<<s;
return 0;
}
输出:
a merry tale
三、遍历字符串(迭代字符串)
我们可以用两种方式来遍历字符串:
使用循环语句
我们可以使用 for 循环、while 循环和 do while 循环通过指针指向字符串的第一个和最后一个索引来遍历字符串。
使用迭代器
使用基于范围的循环,我们可以使用迭代器来遍历字符串。这是通过在运行基于范围的循环时使用 “:” 操作符实现的。
遍历字符串示例
以下示例代码展示了使用这两种方法来遍历字符串:
#include <iostream>
using namespace std;
int main() {
string s="Hey, I am at TP.";
for(int i=0;i<s.length();i++){
cout<<s[i]<<" ";
}
cout<<endl;
for(char c:s){
cout<<c<<" ";
}
return 0;
}
输出:
H e y , I a m a t T P .
H e y , I a m a t T P .
四、访问字符串中的字符
我们可以使用迭代器和指向字符串索引的指针来访问字符串中的字符。
访问字符串中的字符示例
以下示例代码展示了如何访问字符串中的字符:
#include <iostream>
using namespace std;
int main() {
string s="Hey, I am at TP.";
cout<<s<<endl;
for(int i=0;i<s.length();i++){
s[i]='A';
}
cout<<s<<endl;
for(char &c:s){
c='B';
}
cout<<s<<endl;
return 0;
}
输出:
Hey, I am at TP.
AAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBB
五、字符串函数
字符串是 <string>
类的对象,因此,它有一系列用户可以利用来进行各种操作的函数。其中一些函数如下:
函数 |
描述 |
length() |
该函数返回字符串的长度。 |
swap() |
该函数用于交换两个字符串的值。 |
size() |
用于查找字符串的大小。 |
resize() |
该函数用于将字符串的长度调整到给定数量的字符。 |
find() |
用于查找作为参数传递的字符串。 |
push_back() |
该函数用于在字符串末尾添加字符。 |
pop_back() |
该函数用于从字符串弹出最后一个字符。 |
clear() |
该函数用于移除字符串的所有元素。 |
find() |
该函数用于搜索字符串中的某个子串,并返回子串的第一个字符的位置。 |
replace() |
该函数用于替换 [first, last) 范围内等于旧值的每个元素为新值。 |
substr() |
该函数用于从给定的字符串创建子串。 |
compare() |
该函数用于比较两个字符串,并以整数的形式返回结果。 |
erase() |
该函数用于移除字符串的某一部分。 |
六、字符串的长度
字符串的长度是指字符串中存在的字符数量。因此,字符串 "apple" 有 5 个字符的长度,而字符串 "hello son" 有 9 个字符的长度(包括空格)。这可以通过 <string>
头文件中的 length()
方法来访问。
语法
int len = 字符串_1.length();
示例
#include <iostream>
#include <string>
using namespace std;
int main() {
string x="hey boy";
cout<<x.length()<<endl;
return 0;
}
输出:
7
七、字符串拼接
字符串拼接是一种将两个字符串合并的方法。这可以通过两种方式来完成:
加法运算符
加法运算符用于添加两个元素。对于字符串来说,加法运算符将两个字符串拼接在一起。这在以下示例中得到了清晰的解释:
示例
#include <iostream>
#include <string>
using namespace std;
int main() {
string x = "10";
string y = "20";
cout<<x+y<<endl;
return 0;
}
输出:
1020
这不同于整数相加。当我们采用两个整数并使用加法运算符相加时,我们会得到两个数字的和。
这在以下示例中得到了清晰的解释:
示例
#include <iostream>
#include <string>
using namespace std;
int main() {
int x = 10;
int y = 20;
cout<<x+y<<endl;
return 0;
}
输出:
30
八、使用 string append() 方法
C++ 是一种面向对象的编程语言,因此字符串实际上是一个对象,它包含了可以对字符串执行某些操作的函数。我们可以使用 string append() 方法将一个字符串附加到另一个字符串上。
此操作的语法如下:
语法
string_1.append(string_2);
此方法的使用在以下示例中被清楚地描绘出来:
示例
#include <iostream>
#include <string>
using namespace std;
int main() {
string x="hey boy";
string y=" now";
x.append(y);
cout<<x<<endl;
return 0;
}
输出:
hey boy now
九、C++ 中的字符串输入
字符串可以作为程序的输入,最常见的做法是使用 cin
方法。
有三种方法可以获取字符串输入,这些方法如下:
使用 cin
方法
这是最简单的获取字符串输入的方式。其语法如下:
语法
cin>>string_name;
示例
#include <iostream>
using namespace std;
int main() {
string s;
cout << "请输入自定义字符串 : "<<endl;
cin>>s;
cout<<"字符串是 : "<<s;
}
使用 getline()
方法
getline()
方法可以用来从输入流中读取字符串。这个方法定义在 <string>
头文件中。此方法的语法如下:
语法
getline(cin, string_name);
示例
#include <iostream>
using namespace std;
int main() {
string s;
cout << "输入字符串 : " << endl;
getline(cin, s);
cout << "打印的字符串是 : " << s << endl;
return 0;
}
使用 stringstream
stringstream
类用来一次性接收多个字符串作为输入。此方法的语法如下:
语法
Stringstream 对象名(字符串名);
示例
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
string s = "Hey, I am at TP";
stringstream 对象(s);
string 新字符串;
while (对象 >> 新字符串) {
cout << 新字符串 << " ";
}
return 0;
}
输出:
Hey, I am at TP