GESP C++ 3 级 · 知识点

字符串及其函数

GESP C++ 三级要求掌握字符数组与 string 两种字符串表示,能用常用函数完成长度、查找、截取与拼接。字符串题的关键是读入方式:带空格的文本必须用 getline,否则内容会被截断。

对应知识域:字符串及其函数相关真题 4 套

本页为本站原创整理,例题与解析均由本站编写,不取自任何题库原题;考试范围以 CCF 官方公布为准,本平台不是 GESP 官方平台。

考纲要求

  • 理解字符串是以结束符反斜杠零结尾的字符序列,字符数组需要为结束符预留位置。
  • 掌握 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。

本级别其他知识点

官方依据