- C++
C++字符串操作入门
- 2025-7-14 17:19:28 @
C++字符串操作入门教程
一、字符串基础
在C++中,字符串是由多个字符组成的序列。处理字符串是编程中的常见任务,比如文本替换、格式处理、排序等。下面我们通过具体案例来学习字符串操作的核心知识。
1.1 字符串的输入输出
C++中处理字符串常用string
类型,需要包含头文件<string>
。
两种主要输入方式:
cin >> str
:读取字符串,遇到空格或换行停止getline(cin, str)
:读取一整行字符串,包括空格
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1, s2;
// 方式1:使用cin读取(不包含空格)
cin >> s1;
cout << "cin读取的内容:" << s1 << endl;
// 注意:使用cin后如果要立即使用getline,需要处理残留的换行符
cin.ignore(); // 忽略缓冲区中的换行符
// 方式2:使用getline读取整行(包含空格)
getline(cin, s2);
cout << "getline读取的内容:" << s2 << endl;
return 0;
}
二、字符串遍历与修改
2.1 替换字符(例5.15)
题目需求:将字符串中所有指定字符A替换为字符B
解题思路:
- 读取原始字符串
- 读取要替换的字符对(A和B)
- 遍历字符串,逐个检查并替换字符
- 输出替换后的字符串
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
// 读取一整行原文(包含空格)
getline(cin, str);
char a, b;
// 读取要替换的两个字符
cin >> a >> b;
// 获取字符串长度
int len = str.size();
// 遍历字符串中的每个字符
for (int i = 0; i < len; i++) {
// 如果当前字符是a,则替换为b
if (str[i] == a) {
str[i] = b;
}
}
// 输出替换后的结果
cout << str;
return 0;
}
代码说明:
str.size()
:获取字符串长度str[i]
:访问字符串中第i个字符(下标从0开始)- 循环遍历每个字符,进行条件判断和替换
2.2 过滤空格(例5.16)
题目需求:将字符串中连续的多个空格替换为单个空格
解题思路:
- 读取包含多个连续空格的字符串
- 遍历字符串,遇到空格时特殊处理
- 只保留第一个空格,跳过后续连续的空格
- 输出处理后的字符串
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
// 读取带空格的整行字符串
getline(cin, str);
string result; // 用于存储处理后的字符串
bool lastIsSpace = false; // 标记上一个字符是否为空格
for (int i = 0; i < str.size(); i++) {
if (str[i] == ' ') { // 当前字符是空格
if (!lastIsSpace) { // 如果上一个不是空格,就添加这个空格
result += str[i];
lastIsSpace = true;
}
// 如果上一个是空格,就不添加,相当于过滤掉多余空格
} else { // 当前字符不是空格
result += str[i]; // 直接添加
lastIsSpace = false; // 重置标记
}
}
cout << result << endl;
return 0;
}
代码说明:
- 使用
bool
类型变量lastIsSpace
记录上一个字符状态 - 通过状态判断决定是否添加当前字符,实现空格过滤
result += str[i]
:字符串拼接操作
三、字符串数组与排序
3.1 串排序(例5.18)
题目需求:对多个字符串按字母顺序排序并输出
解题思路:
- 读取字符串数量n
- 读取n个字符串存储到数组中
- 使用
sort
函数对字符串数组排序 - 输出排序后的结果
#include <iostream>
#include <string>
#include <algorithm> // 包含sort排序函数
using namespace std;
int main() {
int n;
cin >> n;
// 定义字符串数组,大小为200(题目要求n≤20)
string words[200];
// 读取n个字符串
for (int i = 0; i < n; i++) {
cin >> words[i];
}
// 对字符串数组排序,sort函数默认按字母升序排列
// 参数:起始地址,结束地址(最后一个元素的下一个位置)
sort(words, words + n);
// 输出排序结果
for (int i = 0; i < n; i++) {
cout << words[i] << endl;
}
return 0;
}
代码说明:
#include <algorithm>
:使用sort
函数必须包含的头文件sort(words, words + n)
:对数组从第0个元素到第n-1个元素排序- 字符串比较规则:按字母ASCII值从小到大,与字典排序规则一致
- 数组下标也可以从1开始(如用户提供的代码示例),两种方式均可
四、文件操作基础
4.1 文件重定向(freopen)
除了从键盘输入和屏幕输出,还可以通过文件进行输入输出,使用freopen
函数实现:
#include <iostream>
#include <cstdio> // 包含freopen函数
using namespace std;
int main() {
// 将标准输入重定向到data.txt文件
freopen("data.txt", "r", stdin);
// 将标准输出重定向到output.txt文件
freopen("output.txt", "w", stdout);
// 接下来的cin都会从data.txt读取,cout都会输出到output.txt
int num;
while (cin >> num) { // 从文件读取数据
cout << num * 2 << endl; // 输出到文件
}
// 关闭文件(可选,程序结束会自动关闭)
fclose(stdin);
fclose(stdout);
return 0;
}
代码说明:
freopen("文件名", "模式", 流)
:重定向函数- 模式"r":只读(用于输入)
- 模式"w":只写(用于输出)
- 常用于调试程序时固定输入数据,避免反复手动输入
五、综合练习与拓展
5.1 常见字符串操作总结
操作 | 代码示例 | 说明 |
---|---|---|
获取长度 | str.size() |
返回字符串字符数 |
访问字符 | str[i] |
访问第i个字符(0开始) |
字符串拼接 | str1 + str2 |
合并两个字符串 |
字符串比较 | str1 == str2 |
判断是否相等,支持>、<等 |
查找字符 | str.find('a') |
查找字符第一次出现的位置 |
截取子串 | str.substr(pos, len) |
从pos开始截取len个字符 |
5.2 GESP二级考试相关题目
根据GESP二级考试要求,以下题目需要重点掌握:
- 小杨做题(B3923):涉及分数统计与条件判断
- 时间跨越(B4260):时间计算与转换
- 数三角形(B4356):几何图形计数
这些题目虽然不完全是字符串操作,但都需要运用类似的逻辑思维和循环控制能力。
六、学习建议
- 多动手实践:每个知识点都要编写代码实际运行,观察结果
- 调试技巧:学会使用断点调试,观察变量变化过程
- 循序渐进:先掌握字符串基本操作,再学习数组和排序
- 错题整理:记录易错点,如字符串输入时的换行符处理
- 拓展练习:完成基础题目后,尝试更复杂的字符串处理任务
通过以上内容的学习,你已经掌握了C++字符串操作的核心知识,这些知识不仅是编程入门的基础,也是GESP等编程等级考试的重点内容。勤加练习,才能熟练运用!
0 条评论
目前还没有评论...