考纲要求
- 理解字符串是以结束符反斜杠零结尾的字符序列,字符数组需要为结束符预留位置。
- 掌握 string 的定义、输入输出与下标访问,知道 length() 返回字符个数。
- 会用 find、substr 等方法查找子串与截取片段。
- 能用 getline 读取包含空格的整行文本。
典型题型
- 给出字符串,要求输出长度、某个位置的字符或子串。
- 统计字符串中某类字符出现的次数。
- 判断字符串是否包含指定子串,或按分隔符拆分。
常见错误
- 用 cin 读取带空格的字符串,读到空格就停止,导致内容不完整。这种情况应使用 getline。
- 字符数组长度没有为结束符留位置,导致输出越界或乱码。
- 把字符串容量和长度混淆,容量是能放多少,长度是实际有多少字符。
- 判断找不到子串时把 find 的返回值 0 当成没找到,实际没找到返回 string::npos。
深入理解
两种字符串表示,优先用 string
字符数组 char s[100]; 是 C 语言的写法,末尾必须有一个 '\0' 表示结束,所以装 n 个可见字符至少需要 n + 1 的空间。函数要用 strlen、strcpy、strcmp 这些 C 函数。
string 是 C++ 的写法,string s; 不需要关心长度和结尾符,用 s.length() 取长度、s += "abc" 拼接、s[i] 按下标访问,还可以用 < 直接比较大小。三级题目优先用 string,代码短且不容易出错;只有明确要求字符数组时才写 char[]。
读入方式是第一个分水岭
cin >> s 遇到空格、制表符或换行就停,所以输入 hello world 只能读到 hello。题目要求读一整行(例如含空格的英文句子)时必须用 getline(cin, s)。
还有一个常见陷阱:先用 cin >> n 读了一个整数,紧接着 getline 会读到那个整数后面的换行符,得到一个空字符串。解决方法是在 getline 之前多调用一次 cin.ignore() 把换行吃掉。这个坑不踩一次很难记住,遇到「输入第一行是数字、第二行是文本」的题就要警惕。
常用函数与遍历套路
必备函数:s.length() 或 s.size() 取长度;s.substr(pos, len) 从 pos 开始截 len 个字符;s.find(t) 找子串,找不到返回 string::npos;toupper(c)、tolower(c) 做大小写转换。
统计类题目用范围循环最省事:for (char c : s) { ... } 依次取出每个字符。统计元音这类题要注意不区分大小写,判断前先统一转小写,或者写成 c == 'a' || c == 'A' 六个条件。字符与编码的关系(见 ASCII 编码)在这里直接用得上。
自编例题
遍历字符串统计字符
输入一行文本,统计其中元音字母 a、e、i、o、u 出现的次数,不区分大小写。
string s;
getline(cin, s);
int cnt = 0;
for (char c : s) {
char t = tolower(c);
if (t == 'a' || t == 'e' || t == 'i' || t == 'o' || t == 'u') cnt++;
}
cout << cnt << endl;先用 getline 读入整行,避免空格之后的内容被丢掉。遍历时把每个字符转成小写,再与五个元音比较,这样大小写都能统计到。题目只要求计数,所以不需要保存结果,一个计数器即可。判断子串是否存在时,find 返回的是首次出现的位置,没找到返回 string::npos,不能拿 0 当失败标志,因为 0 表示在开头找到了。
相关真题
这块内容在整条路线里的位置:GESP C++ 3 级备考路径。
READY TO START
开始练习
先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。
常见问题
string 和字符数组有什么区别?
string 是标准库类型,自动管理长度和内存,支持拼接、查找等操作;字符数组是 C 风格字符串,需要自己处理结束符和边界。
getline 和 cin 有什么区别?
cin 以空白字符分隔,读到空格就停;getline 读取整行,直到换行符,适合包含空格的文本。
string::npos 是什么?
它表示「没有找到」的特殊值,通常是一个很大的无符号数。find 找不到子串时返回它,判断时不能写成大于等于 0。
