C++ 竞赛入门

CString

C 风格字符串

本节学会什么

  • char 数组保存以 \0 结尾的文本
  • 了解 strlenstrcmp 的基本用途
  • 避免容量不足和漏掉字符串结束符

为什么需要它

早期竞赛代码和部分库接口使用字符数组表示文本。理解它能读懂这些代码,也能处理需要逐字符操作的题目;但它的容量和结尾都需要程序员自己负责。

最小可运行示例

#include <cstring>
#include <iostream>

int main() {
    char word[20] = "hello";

    std::cout << word << '\n';
    std::cout << std::strlen(word) << '\n';
    return 0;
}

输出为 hello5。数组中实际还保存着结束标记 \0,因此 word 至少需要 6 个位置。strlen 只数结束标记之前的可见字符。

关键过程与易错点

  • char word[] = "hello"; 会自动分配足够空间并补上 \0。手写初始化时必须留出结束标记的位置。
  • std::cin >> word 会在空格或换行前停止。它不知道数组容量,输入过长会越界;竞赛中要确保题目长度不超过数组容量减一。
  • 使用 <cstring> 中的 std::strlen(word) 计算长度。返回值类型是无符号整数,和 int 比较时留意类型。
  • C 风格字符串不能直接用 == 比较内容,应使用 std::strcmp(a, b) == 0 判断相等。返回负数、零、正数分别表示小于、相等、大于。
  • 不要在容量不确定时使用 strcpystrcat。本书的普通文本处理优先用下一节的 std::string

动手检查

创建 char word[10] = "cat";,分别输出 sizeof(word)std::strlen(word),解释为什么前者是容量、后者是文本长度。

再定义 char a[] = "apple";char b[] = "banana";,用 std::strcmp 判断它们的字典序。不要写 a < b

立即练习

难度 题目 题解 训练目标
基础 洛谷 P1914:小书童 - 密码 题解 逐个访问字符,并在字母范围内循环移动。
巩固 洛谷 P1308:统计单词数 题解 处理单词与整行文本,注意空格和大小写。