C++ 竞赛入门
index
字符数组与字符串
本节学会什么
- 区分单个字符
char与一段文本 - 了解 C 风格字符串和
std::string的用途 - 为不同输入格式选择合适的读取方式
为什么需要它
题目的输入不总是数字。姓名、单词、括号序列、地图的一行字符都属于文本。文本由一个个字符组成,但“保存一段文本”和“保存一个字符”需要不同的数据类型和操作。
最小可运行示例
#include <iostream>
#include <string>
int main() {
char initial = 'C';
std::string name = "CppBook";
std::cout << initial << '\n';
std::cout << name << '\n';
return 0;
}
'C' 使用单引号,表示一个 char;"CppBook" 使用双引号,表示一段字符。初学竞赛代码默认优先使用 std::string,只有题目或旧接口明确要求时才使用 C 风格字符串。
关键过程与易错点
- 一个
char可以和整数运算,例如小写字母转大写常用ch - 'a' + 'A',但前提是它确实在小写字母范围内。 std::cin >> word读取一个不含空格的单词;含空格的一整行要使用std::getline,下一节会说明细节。- C 风格字符串本质是
char数组,并以特殊字符\0结尾。它需要手动考虑容量。 std::string自己保存长度,可以直接赋值、拼接和比较,适合本书后续大多数题目。
动手检查
定义 char first = 'A';,输出 first + 1 与 char(first + 1),比较整数和字符的输出差异。
再定义一个 std::string 保存你的名字,输出它和一个空格后的 C++ learner。注意双引号和单引号不能混用。
立即练习
| 难度 | 题目 | 题解 | 训练目标 |
|---|---|---|---|
| 基础 | 洛谷 P5704:字母转换 | 题解 | 读入一个字符,并利用字符编码关系完成转换。 |
| 巩固 | 洛谷 P5732:杨辉三角 | 题解 | 复习按行输出;把“字符序列”和“数值序列”区分开。 |