恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
C++信奥:字符串的操作及应用方法
首页
资讯中心
/
C++信奥:字符串的操作及应用方法
C++信奥:字符串的操作及应用方法
发布时间:2026/8/3 4:32:40
这一章《字符类型和字符数组》是信奥赛的基石。在 CSP-J/S 中字符串处理模拟、解析、加密是必考题型。 C 信奥赛笔记字符串 第一课char与string1. 什么是字符如果把一句话比作一串糖葫芦那么每一颗山楂就是一个字符char。定义char c A;注意必须用单引号 包裹且只能放一个东西ASCII 码的秘密计算机里字符其实是数字A是 65a是 970是 48。口诀小写比大写大 32a - A 32。应用【例5.15】替换字母、【例5.18】串排序都要用到这个规律。2. 两种武器数组 vsstring老式武器char s[100]像一排固定的格子操作快但容易越界比如 P1098 这种老题。新式武器string s像橡皮筋能长能短自带很多功能推荐初学者用这个。️ 第二课基本功训练必会操作1. 怎么读入一整行孩子最容易踩的坑cin遇到空格就停了场景【例5.16】过滤空格、【例5.19】字符串判等。神器getline(cin, s);它可以读入包含空格的整行文字。注意如果前面用了cin n;后面接getline中间要加一句getchar();吃掉回车键2. 怎么知道有多长s.length()或s.size()。应用遍历字符串时循环条件写i s.length()。3. 大小写转换魔法题目【例5.15】替换字母、P1138 将字符串中的小写字母转换成大写字母。代码公式变大写c c - 32;变小写c c 32;判断是不是字母if (c a c z)⚔️ 第三课实战演练结合一本通题目将题目分为三个等级 青铜级单字符操作目标熟悉 ASCII 码和循环遍历。【例5.15】替换字母思路遍历每一个字符如果是 ‘A’ 就改成 ‘E’。考点if(s[i] A) s[i] E;P1138 将字符串中的小写字母转换成大写字母思路遍历如果是小写 a就减去 32。P1146 判断字符串是否为回文思路“回文”就是正着读反着读一样如abcba。技巧用两个指针一个从头i0一个从尾jlen-1向中间靠拢比较。 白银级子串与查找目标学会“切片”和“搜索”。【例5.20】字串包含问题字符串 A 里面有没有字符串 B神器函数s.find(abc)。如果返回值不是string::npos说明找到了P1140 验证子串同上练习find函数的使用。P1141 删除单词后缀思路看看最后几个字符是不是 “ing”, “ly”, “er”。如果是就把它们切掉s.erase(...)或s.substr(...)。P1142 单词的长度思路找空格遇到空格说明一个单词结束了统计长度并重置计数器。 黄金级综合应用与逻辑目标结合数学逻辑或复杂规则。【例5.18】串排序难点字典序排序先比第一个字母一样再比第二个…。解法直接用sort(v.begin(), v.end())对vectorstring排序C 默认就是字典序P1132 基因相关性思路这是一个统计题。遍历两个字符串数一数有多少个位置字符相同算出比例。P1136 配对碱基链思路映射关系。A-T, G-C。遍历字符串用if-else或者switch进行转换输出。P1145 字符串p型编码思路游程编码RLE。比如aaabbc-3a2b1c。需要记录当前字符和它连续出现的次数。 小贴士避坑指南关于char数组的结束符\0C 风格字符串最后藏着一个看不见的“小尾巴”\0。所以定义数组时长度要比实际文字多 1。例如存 “Hi” 需要char s[3]。关于下标越界字符串长度是len最后一个字符的下标是len-1。这是新手最容易报错的地方Runtime Error。关于调试在循环里打印i和s[i]看看程序到底在读什么这比干瞪眼有效得多。 课后作业清单建议顺序P1138 大小写转换热身P1146 回文串判断经典逻辑P1140 验证子串学习 findP1141 删除后缀学习 substr/eraseP1132 基因相关性综合统计P1145 p型编码挑战题C 字符串教学内容和常见操作方法可归纳为两大体系C 风格字符数组与标准库std::string其中后者是信奥赛和工程实践中的主流选择。建议以string为主线辅以字符数组基础概念一、注意点字符与字符串的本质字符是单个符号如A、1用单引号包裹字符串是字符序列用双引号包裹。计算机中字符本质是数字ASCII 码例如A 65a 97小写比大写大 32。这是大小写转换、字母排序等题目的底层逻辑。两种字符串表示法C 风格字符数组char s[100] Hello;以\0结尾需手动管理长度和边界适合理解底层原理。std::stringstring s Hello;自动管理内存支持动态扩容内置丰富方法是竞赛首选。输入输出陷阱cin s遇到空格/换行即停止适用于单单词输入。getline(cin, s)可读取整行含空格的文本但若前文有cin n需加getchar()吃掉残留换行符否则getline会读入空行。常用操作方法基础属性s.length()或s.size()获取长度s.empty()判断是否为空。访问与修改s[i]或s.at(i)访问第 i 个字符从 0 开始s.push_back(x)尾部追加字符s.insert(pos, abc)在位置 pos 插入子串。拼接与替换s1 s2或s1.append(s2)拼接s.replace(start, len, new)替换从 start 开始、长度为 len 的子串。查找与截取s.find(abc)返回子串首次出现位置未找到返回string::nposs.substr(start, len)提取子串。比较与清空s1 s2直接比较内容s.clear()清空字符串。高频考点题型大小写转换遍历字符串若字符在a-z范围则减去 32 转为大写。回文判断首尾双指针向中间逼近比较对应字符是否相等。子串匹配用find()或手动滑动窗口实现。词频统计结合mapstring, int统计每个单词出现次数。加密解密如凯撒密码对每个字符按固定偏移量变换。二、避坑指南避免过早引入指针无需理解char*聚焦string即可。警惕越界访问强调s[i]的 i 必须小于s.length()否则行为未定义。慎用c_str()仅在调用 C 风格函数如printf时才需转换日常操作用string原生方法。注意find()返回值未找到时返回string::npos通常为-1或极大值不可直接与0比较。找我领一份「学生速查表」~