GESP 三级 · GESP 202406 C++ 三级 第 15 题

选择题 · 答案 A · 考点:循环控制

← 整套速查表 GESP 三级 全部真题

题目

如果执行下面 C++ 代码后,输出的结果是“gesp ccf org cn”,则横线上应填入哪个代码?( )

#include <iostream>
using namespace std;

int main() {
    string str = "gesp.ccf.org.cn";

    string delimiter = ".";
    string result = "";
    string token;
    size_t found = str.find(delimiter);
    while (found != string::npos) {
        token = str.substr(0, found);
        result += token;
        result += " ";
        ________________ // 在此处填入代码
        found = str.find(delimiter);
    }

    //最后一部分
    result += str;
    result += " ";

    cout << result << endl;
    return 0;
}
答案:A

考点

循环控制

解题思维

答案A。位运算代码补全要注意区分位运算符(&|^)和逻辑运算符(&&||)。异或(^)常用于交换值。

常见错误

位运算代码补全容易出错,因为位运算结果不如算术运算直观。记住异或的自反性。

详细解析(节选)

【考点】字符串查找|字符串截取|循环控制

考纲定位:本题考查 GESP 三级"字符串基础"模块中的 str.find 与 str.substr 组合使用。命题人刻意在此处设坑——90% 的考生只关注 while 条件,却忽略循环体内必须更新 str 本身,否则无法逐段提取后续子串。

解题思维:看到输出结果"gesp ccf org cn",立刻意识到原字符串"gesp.ccf.org.cn"需按点号分拆。代码前半段已正确取到第一个 token"gesp",此时 found 指向第一个点号位置。要进入下一轮,必须把 str 截断为从下一个点号后开始、且去掉末尾点号的子串。str.substr(found + delimiter.length(), str.length() - 1) 正好满足:起始位置 found + 1,长度 str.length() - 1(去掉末尾点号)。这样下次循环能继续找到下一个点号。

陷阱拆解:

命题人利用考生对 substr 第二个参数"长度"的误解,以及忽略循环体内状态更新的惯性思维。

反命题思维:若将横线改为 str = str.substr(found + 1, str.length() - 1);(去掉 delimiter.length()),因点号长度为 1,效果相同;但改成 str = str.substr(0, str.length() - 1); 会丢失最后一个 token"cn"。若改用 for 循环手动计数,则需额外维护索引,复杂度上升。

刷到类似题时,先问自己:循环体内是否更新了所有状态变量?substr 的第二个参数是长度不是位置!

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断