字符串基础
学习如何访问字符串中的各个元素。
集合
集合 是一个通用术语,用于将多个值组合成一个整体。我们在现实生活中经常使用集合——一本书是页面的集合,一列火车是车厢的集合,一个衣柜是衣物的集合。
字符串
字符串 是字符的集合,通常被视为一个单一单元。字符串用于存储文本值,如姓名、地址、消息等。
字符串的初始化
以下程序演示了字符串的初始化:
1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() 6{ 7 string string1 = "这是一个字符串。"; 8 cout << string1 << endl; 9 10 return 0; 11}
注意: 我们必须在第2行编写
#include <string>,以包含允许在程序中使用string数据类型的头文件string。
在上述代码中:
- 第7行,我们将
string1初始化为用双引号"包裹的文本值。 - 第8行,我们输出该字符串。
访问字符串中的字符
C++ 允许我们通过整数 索引 来访问字符串中的单个字符。为此,我们在字符串变量名后用方括号 [ ] 包含索引号,如下所示的程序:
1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() 6{ 7 string string1 = "Educative"; 8 cout << string1 << endl; 9 10 cout << string1[0] << endl; // 显示字符串的第一个元素 11 cout << string1[1] << endl; // 显示字符串的第二个元素 12 cout << string1[2] << endl; // 显示字符串的第三个元素 13 cout << string1[3] << endl; // 显示字符串的第四个元素 14 cout << string1[4] << endl; // 显示字符串的第五个元素 15 cout << string1[5] << endl; // 显示字符串的第六个元素 16 cout << string1[6] << endl; // 显示字符串的第七个元素 17 cout << string1[7] << endl; // 显示字符串的第八个元素 18 cout << string1[8] << endl; // 显示字符串的第九个元素 19 return 0; 20}
上述代码逐行显示字符串的各个字符。第一个字符位于索引 0,索引沿字符串线性递增,如下图所示:
同样的程序也可以使用循环重写,如下所示,实现相同的功能:
1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() 6{ 7 string string1 = "Educative"; 8 cout << string1 << endl; // 显示整个字符串 9 int length = 9; // 存储数组的长度 10 11 for (int i = 0; i < length; i++) // for 循环逐个显示字符串字符 12 { 13 cout << string1[i] << endl; 14 } 15 16 return 0; 17}
拼接
使用 + 运算符连接两个字符串称为 拼接,如下代码所示:
1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() 6{ 7 string str1 = "Hello"; 8 string str2 = "Educative"; 9 string str3 = str1 + str2; 10 string str4 = str1 + " " + str2; 11 12 cout << str1 << endl; 13 cout << str2 << endl; 14 cout << str3 << endl; // 拼接时不加空格 15 cout << str4 << endl; // 拼接时加空格 16 return 0; 17}
在上述代码中:
- 第9行:我们将
str1和str2拼接,并将结果存储在str3中。两个单词之间没有空格。 - 第10行:我们将
str1、" "和str2拼接,并将结果存储在str4中。两个单词之间有空格。
字符串操作练习
以下是几个用于练习 C++ 中字符串操作的示例程序。点击“显示答案”按钮将显示解决相应问题的程序。您可以将给出的解决方案复制粘贴到代码编辑器中,以确保您的输出与给定解决方案一致。编程中可能存在多种正确的解决方案。
反向打印字符
编写一个程序,按行反向显示字符串的每个字符。字符串长度限制为九个字符。
示例输入
1"Educative"
示例输出
1e 2v 3i 4t 5a 6c 7u 8d 9E
1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() 6{ 7 string str = "Educative"; 8 // 在此处编写代码。 9 return 0; 10}
您可以在上方的代码编辑器中运行以下代码:
1#include <iostream> 2#include <string> 3using namespace std; 4int main() 5{ 6 string str = "Educative"; 7 cout << str[8] << endl; 8 cout << str[7] << endl; 9 cout << str[6] << endl; 10 cout << str[5] << endl; 11 cout << str[4] << endl; 12 cout << str[3] << endl; 13 cout << str[2] << endl; 14 cout << str[1] << endl; 15 cout << str[0] << endl; 16 return 0; 17}
在上述程序中:
- 我们使用变量
string存储文本Educative。 - 我们使用索引反向显示
string的各个字符。
或者
您也可以在上方的代码编辑器中运行以下代码:
1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() 6{ 7 string string1 = "Educative"; 8 cout << string1 << endl; // 显示整个字符串 9 10 for (int i = 8; i >= 0; i--) // for 循环反向逐个显示字符串字符 11 { 12 cout << string1[i] << endl; 13 } 14 15 return 0; 16}
在上述程序中:
- 我们使用变量
string存储文本Educative。 - 我们使用索引和
for循环反向显示string的各个字符。
左移字符串中的字符
编写一个程序,将字符串中的字符向左移动,并将最后一个位置替换为点号。字符串长度限制为九个字符。
示例输入
1"Educative"
示例输出
1ducative.
提示: 使用索引来更新字符串中的每个字符。
1#include <iostream> 2#include <string> 3 4int main() 5{ 6 string myString = "Educative"; 7 // 在此处编写代码 8 return 0; 9}
您可以在上方的代码编辑器中运行以下代码:
1#include <iostream> 2#include<string> 3using namespace std; 4 5int main() 6{ 7 string myString = "Educative"; 8 myString[0] = myString[1]; 9 myString[1] = myString[2]; 10 myString[2] = myString[3]; 11 myString[3] = myString[4]; 12 myString[4] = myString[5]; 13 myString[5] = myString[6]; 14 myString[6] = myString[7]; 15 myString[7] = myString[8]; 16 myString[8] = '.';// 单个字符赋值 17 18 cout << myString << endl; 19 return 0; 20}
在上述程序中:
- 我们使用变量
myString存储文本Educative。 - 我们逐个将
myString的每个字母向左移动。本质上,我们将某个索引处的字符更新为其前一个索引的字符。在最后一个索引处,我们存储一个字符'.'。 - 我们显示
myString的更新后的值。
反转字符串
编写一个程序,将一个字符串的内容以相反顺序存储到另一个字符串中。字符串长度限制为九个字符。
示例输入
1"Educative"
示例输出
1evitacudE
1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() 6{ 7 string myString = "Educative"; 8 // 在此处编写代码。 9 return 0; 10}
您可以在上方的代码编辑器中运行以下代码:
1#include <iostream> 2#include<string> 3using namespace std; 4 5int main() 6{ 7 string myString1 = "Educative"; 8 string myString2; // 空字符串 9 myString2 += myString1[8]; // 将 myString1 的最后一个字符连接到 myString2 10 myString2 += myString1[7]; 11 myString2 += myString1[6]; 12 myString2 += myString1[5]; 13 myString2 += myString1[4]; 14 myString2 += myString1[3]; 15 myString2 += myString1[2]; 16 myString2 += myString1[1]; 17 myString2 += myString1[0]; // 将 myString1 的第一个字符连接到 myString2 18 19 cout << myString2 << endl; 20 return 0; 21}
在上述程序中:
- 我们使用变量
myString1存储文本Educative。 - 我们使用另一个变量
myString2在程序结束时保存myString1的反转内容。 - 我们将
myString1从索引8到索引0的最后一个字符依次连接到myString2的末尾。 - 我们显示
myString2的更新值。
或者
1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() 6{ 7 string myString1 = "Educative"; 8 string myString2; // 空字符串 9 for (int i = 8; i >= 0; i--) 10 { 11 myString2 += myString1[i]; 12 } 13 14 cout << myString2 << endl; 15 return 0; 16}
在上述程序中:
- 我们使用变量
myString1存储文本Educative。 - 我们使用另一个变量
myString2在程序结束时保存myString1的反转内容。 - 我们使用一个倒序计数器
i的for循环,从索引8到索引0访问myString1的每个索引。 - 在循环中,我们将
myString1的每个字符连接到myString2的末尾。 - 我们显示
myString2的更新值。
回文测试
回文 是一个正读和反读都相同的字符序列。编写一个程序来检查一个字符串是否为回文。考虑长度为五个字符的字符串。
示例输入 1
1"level"
示例输出 1
1回文
示例输入 2
1"legal"
示例输出 2
1不是回文
1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() 6{ 7 string str = "level"; 8 // 在此处编写代码。 9 return 0; 10}
您可以在上方的代码编辑器中运行以下代码(一种可能的解决方案):
1#include<iostream> 2#include <string> 3using namespace std; 4 5int main () 6{ 7 string str = "level"; 8 if(str [0] == str [4] && str [1] == str [3]) 9 { 10 cout << "回文" << std::endl; 11 } 12 else 13 { 14 cout << "不是回文" << endl; 15 } 16 return 0; 17}
在上述代码中:
- 我们使用
string变量str存储文本level。 - 我们比较字符串的第一个索引值与最后一个索引值,然后比较第二个索引值与倒数第二个索引值,作为条件表达式。
- 我们使用逻辑运算符
&&将两个条件连接起来,当两个条件都为真时返回true。 - 如果条件表达式为真,则显示
回文;否则显示不是回文。