C++ 字符串
C++ 提供以下两种类型的字符串表示 -
- C 风格的字符串。
- 标准 C++ 中引入的 string 类类型。
C 风格的字符串
C 风格的字符串起源于 C 语言,并继续在 C++ 中得到支持。该字符串实际上是一个一维字符数组,以 空 字符 '\0' 结尾。因此,以空字符结尾的字符串包含组成该字符串的字符,后跟一个 空。
以下声明和初始化创建了一个由单词"Hello"组成的字符串。为了将空字符保存在数组末尾,包含该字符串的字符数组的大小应比单词"Hello"的字符数多一个。
char greet[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
如果遵循数组初始化规则,则可以将上述语句编写如下 -
char greet[] = "Hello";
以下是上述定义的字符串在 C/C++ 中的内存表示 -
实际上,字符串常量的末尾不需要放置空字符。 C++ 编译器在初始化数组时会自动在字符串末尾添加 '\0'。让我们尝试打印上述字符串 -
示例
#include <iostream>
using namespace std;
int main () {
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "Greeting message: ";
cout << greeting << endl;
return 0;
}
当编译并执行上述代码时,它会产生以下结果 -
Greeting message: Hello
C 风格字符串函数
C++ 支持多种操作以空字符结尾的字符串的函数。这些函数定义在 <string.h> 头文件 中。
| Sr.No | 函数 &用途 |
|---|---|
| 1 |
将字符串 s2 复制到字符串 s1 中。 |
| 2 |
将字符串 s2 连接到字符串 s1 的末尾。 |
| 3 |
返回字符串 s1 的长度。 |
| 4 |
如果 s1 和 s2 相同,则返回 0;如果 s1 |
| 5 |
返回指向字符串 s1 中字符 ch 首次出现的指针。 |
| 6 |
返回指向字符串 s2 首次出现的指针s1. |
示例
以下示例使用了上述几个函数 −
#include <iostream>
#include <cstring>
using namespace std;
int main () {
char str1[10] = "Hello";
char str2[10] = "World";
char str3[10];
int len ;
// 将 str1 复制到 str3 中
strcpy( str3, str1);
cout << "strcpy( str3, str1) : " << str3 << endl;
// 连接 str1 和 str2
strcat( str1, str2);
cout << "strcat( str1, str2): " << str1 << endl;
// 连接后 str1 的总长度
len = strlen(str1);
cout << "strlen(str1) : " << len << endl;
return 0;
}
当上述代码被编译并执行时,它会产生如下结果 -
strcpy( str3, str1) : Hello strcat( str1, str2): HelloWorld strlen(str1) : 10
C++ 中的 String 类
标准 C++ 库提供了一个 string 类,它支持上述所有操作,此外还提供了更多功能。
String 类示例
让我们检查以下示例 -
#include <iostream>
#include <string>
using namespace std;
int main () {
string str1 = "Hello";
string str2 = "World";
string str3;
int len ;
// 将 str1 复制到 str3 中
str3 = str1;
cout << "str3 : " << str3 << endl;
// 连接 str1 和 str2
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
// 连接后 str3 的总长度
len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
}
当上述代码被编译并执行时,它会产生如下结果 -
str3 : Hello str1 + str2 : HelloWorld str3.size() : 10
创建字符串
我们可以通过两种方式创建字符串变量,使用以下任一方法 -
使用字符数组创建字符串
我们可以使用C 类型数组以字符格式声明字符串。使用以下语法完成 -
语法
char variable_name[len_value] ;
其中,len_value 是字符数组的长度。
使用字符数组创建字符串的示例
在以下示例中,我们声明一个字符数组,并为其赋值。
#include <iostream>
using namespace std;
int main() {
char s[5]={'h','e','l','l','o'};
cout<<s<<endl;
return 0;
}
Output
hello
使用 <string> 创建字符串
我们可以使用 'string' 关键字声明一个字符串变量。该关键字包含在 <string> 头文件 中。声明字符串的语法解释如下:
语法
string variable_name = [value];
其中,[value] 是可选参数,可用于在声明期间赋值。
示例
在以下示例中,我们声明一个字符串变量,并为其赋值。
#include <iostream>
using namespace std;
int main() {
string s="a merry tale";
cout<<s;
return 0;
}
Output
a merry tale
遍历字符串(迭代字符串)
我们可以通过两种方式迭代字符串 -
使用循环语句
我们可以使用 for 循环、while 循环以及使用指向字符串中第一个和最后一个索引的指针执行 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 = string_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;
}
Output
30
使用字符串 append() 方法
C++ 是一种面向对象的编程语言,因此字符串实际上是一个对象,其中包含可以对字符串执行某些操作的函数。我们可以使用 字符串 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
- getline()
- stringstream
使用 cin 方法
这是将字符串作为输入的最简单方法。语法如下所示 -
语法
cin>>string_name;
示例
#include <iostream>
using namespace std;
int main() {
string s;
cout << "Enter custom string : "<<endl;
//在此处输入字符串
cin>>s;
cout<<"The string is : "<<s;
}
使用 getline() 方法
getline() 方法可用于从输入流读取字符串。该方法定义在 <string> 头文件中。上述方法的语法如下:
语法
getline(cin, string_name);
示例
#include <iostream>
using namespace std;
int main() {
string s;
cout << "Enter String as input : " << endl;
getline(cin, s);
//在此处输入字符串
cout << "Printed string is : " << s << endl;
return 0;
}
使用 stringstream
stringstream 类用于一次性接收多个字符串作为输入。上述方法的语法如下:
语法
Stringstream object_name(string_name);
示例
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
string s = "Hey, I am at TP";
stringstream object(s);
string newstr;
// >> 运算符将从 stringstream 对象读取
while (object >> newstr) {
cout << newstr << " ";
}
return 0;
}
输出
Hey, I am at TP

