- C++ 基础
- C++ 首页
- C++ 概述
- C++ 环境设置
- C++ 基本语法
- C++ 注释
- C++ Hello World
- C++ 省略命名空间
- C++ 常量/字面量
- C++ 关键字
- C++ 标识符
- C++ 数据类型
- C++ 数值数据类型
- C++ 字符数据类型
- C++ 布尔数据类型
- C++ 变量类型
- C++ 变量作用域
- C++ 多个变量
- C++ 基本输入/输出
- C++ 修饰符类型
- C++ 存储类
- C++ 运算符
- C++ 数字
- C++ 枚举
- C++ 引用
- C++ 日期和时间
- C++ 控制语句
- C++ 决策
- C++ if 语句
- C++ if else 语句
- C++ 嵌套 if 语句
- C++ switch 语句
- C++ 嵌套 switch 语句
- C++ 循环类型
- C++ while 循环
- C++ for 循环
- C++ do while 循环
- C++ foreach 循环
- C++ 嵌套循环
- C++ break 语句
- C++ continue 语句
- C++ goto 语句
- C++ 构造函数
- C++ 构造函数和析构函数
- C++ 复制构造函数
C++ 字符串
C++ 提供以下两种类型的字符串表示:
- C 风格字符串。
- 标准 C++ 中引入的 string 类类型。
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 << "Greeting message: "; cout << greeting << endl; return 0; }
编译并执行上述代码时,将产生以下结果:
Greeting message: Hello
C 风格字符串函数
C++ 支持广泛的函数来操作以 null 结尾的字符串。这些函数在<string.h> 头文件中定义。
序号 | 函数和用途 |
---|---|
1 |
将字符串 s2 复制到字符串 s1。 |
2 |
将字符串 s2 连接到字符串 s1 的末尾。 |
3 |
返回字符串 s1 的长度。 |
4 |
如果 s1 和 s2 相同,则返回 0;如果 s1<s2,则返回小于 0 的值;如果 s1>s2,则返回大于 0 的值。 |
5 |
返回指向字符串 s1 中字符 ch 的第一次出现的指针。 |
6 |
返回指向字符串 s1 中字符串 s2 的第一次出现的指针。 |
示例
以下示例使用了上述几个函数:
#include <iostream> #include <cstring> using namespace std; int main () { char str1[10] = "Hello"; char str2[10] = "World"; char str3[10]; int len ; // copy str1 into str3 strcpy( str3, str1); cout << "strcpy( str3, str1) : " << str3 << endl; // concatenates str1 and str2 strcat( str1, str2); cout << "strcat( str1, str2): " << str1 << endl; // total lenghth of str1 after concatenation 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 ; // copy str1 into str3 str3 = str1; cout << "str3 : " << str3 << endl; // concatenates str1 and str2 str3 = str1 + str2; cout << "str1 + str2 : " << str3 << endl; // total length of str3 after concatenation 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; }
输出
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; }
输出
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 是<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; }
输出
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
- getline()
- stringstream
使用 cin 方法
这是将字符串作为输入的最简单方法。语法如下:
语法
cin>>string_name;
示例
#include <iostream> using namespace std; int main() { string s; cout << "Enter custom string : "<<endl; //enter the string here 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); //enter the string here 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; // >> operator will read from the stringstream object while (object >> newstr) { cout << newstr << " "; } return 0; }
输出
Hey, I am at TP