C++ 竞赛入门
CString
C 风格字符串
本节学会什么
- 用
char数组保存以\0结尾的文本 - 了解
strlen、strcmp的基本用途 - 避免容量不足和漏掉字符串结束符
为什么需要它
早期竞赛代码和部分库接口使用字符数组表示文本。理解它能读懂这些代码,也能处理需要逐字符操作的题目;但它的容量和结尾都需要程序员自己负责。
最小可运行示例
#include <cstring>
#include <iostream>
int main() {
char word[20] = "hello";
std::cout << word << '\n';
std::cout << std::strlen(word) << '\n';
return 0;
}
输出为 hello 和 5。数组中实际还保存着结束标记 \0,因此 word 至少需要 6 个位置。strlen 只数结束标记之前的可见字符。
关键过程与易错点
char word[] = "hello";会自动分配足够空间并补上\0。手写初始化时必须留出结束标记的位置。std::cin >> word会在空格或换行前停止。它不知道数组容量,输入过长会越界;竞赛中要确保题目长度不超过数组容量减一。- 使用
<cstring>中的std::strlen(word)计算长度。返回值类型是无符号整数,和int比较时留意类型。 - C 风格字符串不能直接用
==比较内容,应使用std::strcmp(a, b) == 0判断相等。返回负数、零、正数分别表示小于、相等、大于。 - 不要在容量不确定时使用
strcpy、strcat。本书的普通文本处理优先用下一节的std::string。
动手检查
创建 char word[10] = "cat";,分别输出 sizeof(word) 和 std::strlen(word),解释为什么前者是容量、后者是文本长度。
再定义 char a[] = "apple"; 与 char b[] = "banana";,用 std::strcmp 判断它们的字典序。不要写 a < b。
立即练习
| 难度 | 题目 | 题解 | 训练目标 |
|---|---|---|---|
| 基础 | 洛谷 P1914:小书童 - 密码 | 题解 | 逐个访问字符,并在字母范围内循环移动。 |
| 巩固 | 洛谷 P1308:统计单词数 | 题解 | 处理单词与整行文本,注意空格和大小写。 |