CSP-J/S冲奖第5天:C++ 字符串
一、什么是字符串?
-
定义:字符串是由字符组成的序列,用于存储和操作文本数据。
-
类比:就像现实生活中的句子或单词,字符串是由一个个字母(字符)组成的。
- 特点:
-
字符串可以包含字母、数字、符号等。
- 在 C++ 中,有两种主要的字符串表示方式:
-
C 风格字符串:以字符数组的形式存储,以空字符
\0
结尾。 -
std::string
类型:C++ 标准库提供的字符串类型,功能更强大且易于使用。
-
-
二、C 风格字符串
1. 定义与初始化
-
定义:C 风格字符串是一个字符数组,以空字符
\0
结尾。 - 语法:
char 字符串名[大小];
- 初始化:
char greeting[] = "Hello"; // 自动添加末尾的 '\0' char name[10] = {'J', 'o', 'h', 'n', '\0'}; // 手动添加 '\0'
1V1+:malaoshi606
2. 示例
#include <iostream>
using namespace std;
int main() {
char greeting[] = "Hello, World!";
cout << greeting << endl; // 输出字符串
return 0;
}
运行结果:
Hello, World!
3. 常见问题
-
固定大小:C 风格字符串的大小在定义时固定,无法动态扩展。
-
越界风险:如果忘记添加
\0
或超出数组范围,可能导致未定义行为。 -
操作复杂:需要手动处理字符串拼接、比较等操作。
三、std::string
类型
1. 定义与初始化
-
定义:
std::string
是 C++ 标准库提供的字符串类型,位于<string>
头文件中。 - 语法:
string 字符串名;
- 初始化:
string greeting = "Hello, World!"; string empty; // 空字符串 string copy = greeting; // 拷贝另一个字符串
2. 示例
#include <iostream>
#include <string> // 包含 string 头文件
using namespace std;
int main() {
string greeting = "Hello, World!";
cout << greeting << endl; // 输出字符串
return 0;
}
运行结果:
Hello, World!
3. 常见操作
(1) 输入与输出
- 使用
cin
和getline
读取字符串:string name; cout << "请输入你的名字:"; cin >> name; // 只能读取一个单词(遇到空格停止) cout << "你好," << name << endl; string sentence; cout << "请输入一句话:"; getline(cin, sentence); // 读取整行输入(包括空格) cout << "你输入的是:" << sentence << endl;
(2) 拼接字符串
- 使用
+
运算符连接两个字符串:string first = "Hello, "; string second = "World!"; string result = first + second; cout << result << endl; // 输出 "Hello, World!"
(3) 获取长度
- 使用
.size()
或.length()
方法获取字符串的长度:string text = "C++ is fun!"; cout << "字符串长度:" << text.size() << endl; // 输出 11
(4) 访问字符
- 使用索引访问字符串中的单个字符(从
0
开始):string text = "Hello"; cout << "第一个字符:" << text[0] << endl; // 输出 'H' cout << "最后一个字符:" << text[text.size() - 1] << endl; // 输出 'o'
(5) 比较字符串
- 使用
==
、!=
、<
、>
等运算符比较字符串:string a = "apple"; string b = "banana"; if (a < b) { cout << a << " 在字典序上小于 " << b << endl; }
(6) 查找子字符串
- 使用
.find()
方法查找子字符串的位置:string text = "Hello, World!"; size_t pos = text.find("World"); // 返回子字符串的起始位置 if (pos != string::npos) { // 如果找到 cout << "子字符串 'World' 的位置:" << pos << endl; // 输出 7 } else { cout << "未找到子字符串" << endl; }
四、综合练习
练习 1:统计字符数量
编写一个程序,输入一个字符串,统计其中字母、数字和其他字符的数量。
参考代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
string text;
cout << "请输入一个字符串:";
getline(cin, text);
int letters = 0, digits = 0, others = 0;
for (char c : text) { // 遍历字符串中的每个字符
if (isalpha(c)) { // 判断是否为字母
letters++;
} else if (isdigit(c)) { // 判断是否为数字
digits++;
} else { // 其他字符
others++;
}
}
cout << "字母数量:" << letters << endl;
cout << "数字数量:" << digits << endl;
cout << "其他字符数量:" << others << endl;
return 0;
}
练习 2:反转字符串
编写一个程序,输入一个字符串,将其反转并输出。
参考代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
string text;
cout << "请输入一个字符串:";
getline(cin, text);
string reversed = "";
for (int i = text.size() - 1; i >= 0; i--) {
reversed += text[i]; // 从后往前拼接字符
}
cout << "反转后的字符串:" << reversed << endl;
return 0;
}
练习 3:判断回文字符串
编写一个程序,输入一个字符串,判断它是否是回文字符串(正着读和反着读相同)。
参考代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
string text;
cout << "请输入一个字符串:";
getline(cin, text);
bool isPalindrome = true;
int n = text.size();
for (int i = 0; i < n / 2; i++) {
if (text[i] != text[n - i - 1]) { // 比较首尾字符
isPalindrome = false;
break;
}
}
if (isPalindrome) {
cout << "这是一个回文字符串" << endl;
} else {
cout << "这不是一个回文字符串" << endl;
}
return 0;
}
五、注意事项
-
C 风格字符串的风险:
-
必须确保以
\0
结尾,否则可能导致未定义行为。 -
不支持直接拼接、比较等操作,需使用标准库函数(如
strcmp
、strcat
等)。
-
-
std::string
的优势:-
动态扩展,无需担心大小限制。
-
提供丰富的内置方法,简化字符串操作。
-
-
输入方式的选择:
-
cin
:只能读取一个单词(遇到空格停止)。 -
getline
:可以读取整行输入(包括空格)。
-
六、总结
-
字符串是存储和操作文本数据的重要工具。
-
C++ 提供了两种字符串表示方式:C 风格字符串 和
std::string
类型。 -
std::string
更加灵活和易用,推荐初学者优先使用。 -
常见的操作包括拼接、比较、查找、反转等。
-
注意避免数组越界和未初始化的问题。