大家好啊这里是土豆的博客一个正在努力学习技术的大学生。上一篇我们聊了string的基础操作比如s.size()求长度、s[i]访问字符以及用循环遍历字符串。今天这篇就直接用几道小题来练一练。字符串题刚开始不用急着做复杂的先把遍历、判断、修改这些基础动作写顺后面会轻松很多。好了废话不多说咱们直接开始。第一题统计某个字符出现次数题目输入一个字符串再输入一个字符统计这个字符在字符串中出现了多少次。比如输入banana a输出3这道题其实和数组里统计某个数字出现次数很像。数组里是一个一个看数字字符串里是一个一个看字符。代码如下#include iostream using namespace std; int main() { string s; char ch; cin s; cin ch; int cnt 0; for(int i 0; i s.size(); i) { if(s[i] ch) { cnt; } } cout cnt; return 0; }这里最关键的地方是if(s[i] ch)i从 0 开始变化每次访问字符串中的一个字符。如果当前字符和目标字符相等就让cnt加 1。很多同学刚开始容易把写成。比较是否相等要用赋值才用写条件判断时可以多看一眼。这道题想练的是遍历字符串并在遍历过程中做判断和计数。第二题反向输出字符串题目输入一个字符串把它反过来输出。比如输入hello输出olleh这道题只需要倒着访问每个字符就可以。代码如下#include iostream using namespace std; int main() { string s; cin s; for(int i s.size() - 1; i 0; i--) { cout s[i]; } return 0; }这里最容易写错的是起点。如果字符串是hello长度是 5下标是0 1 2 3 4最后一个字符的下标是4也就是s.size() - 1所以反向输出时循环从s.size() - 1开始一直走到0。有些同学会写成for(int i s.size(); i 0; i--)这样一开始就访问了s[5]已经越界了。字符串和数组一样长度是n最后一个合法下标就是n - 1。这道题主要练的是反向遍历。后面做回文判断、逆序处理时经常会用到类似思路。第三题判断字符串是不是回文题目输入一个字符串判断它是不是回文。回文的意思是正着读和反着读一样比如level它就是回文。hello就不是回文。我们可以用两个下标来做一个从左边开始一个从右边开始。每次比较左右两个字符如果不一样就说明它不是回文。代码如下#include iostream using namespace std; int main() { string s; cin s; int left 0; int right s.size() - 1; bool ok true; while(left right) { if(s[left] ! s[right]) { ok false; break; } left; right--; } if(ok) { cout Yes; } else { cout No; } return 0; }这道题比前两题稍微多了一点思路但也不复杂只是需要注意下边界问题。比如字符串是level第一次比较s[0] 和 s[4]都是l。第二次比较s[1] 和 s[3]都是e。中间的v不用再和谁比较因为左右已经走到中间了。这里的left和right很像两个同学从两边往中间走每走一步就看当前字符是否一样。如果中途发现不一样就可以提前结束。这道题里面字符串不一定只能从左到右遍历有时候从两头往中间看会更方便。第四题把小写字母改成大写字母题目输入一个只包含小写字母的字符串把它全部转换成大写字母。比如输入hello输出HELLO代码如下这里用到了 ASCII 码。ASCII 码可以简单理解成计算机给常见字符安排的一张“编号表”。比如字符 A、B、a、b 在表里都有对应的数字编号。常见 ASCII 编码里A 65 B 66 C 67 a 97 b 98 c 99所以在 C 里单引号里的字符比如a、A本质上是一个char字符。它背后有对应的 ASCII 数字编号所以可以参与加减运算。比如c - a可以理解成99 - 97 2也就是说c比a往后数 2 位。再看这句代码s[i] s[i] - a A;如果s[i]是c那么计算过程可以理解成c - a A 99 - 97 65 67而 ASCII 码中67 对应的字符就是C。所以这句代码的作用就是先算出当前小写字母距离a有多远再从A开始往后移动相同的位置得到对应的大写字母。另外在 ASCII 码表里同一个字母的大写和小写编号相差 32a - A 32 b - B 32 c - C 32所以小写字母转大写字母也可以理解成把 ASCII 编号减去 32。比如a是 97减去 32 得到 65也就是A。不过写代码时用s[i] s[i] - a A;可读性更好因为一眼能看出来是在做“小写转大写”。总结今天这篇我们用几道小题练了字符串的基础操作统计某个字符出现次数。反向输出字符串。判断字符串是不是回文。把小写字母转换成大写字母。对于刚开始学 C 的同学来说字符串题的第一步就是把s.size()、s[i]和循环配合写熟。不用一开始就背很多字符串函数。先把遍历、判断、修改这些基本操作练顺后面遇到更复杂的字符串题也能慢慢拆开来写。那这篇就先到这里。如果觉得有帮助记得点赞、关注和收藏谢谢有什么问题欢迎在评论区留言我们一起交流。我们下篇见
C++ 入门学习经验 13——字符串练习篇:统计、反向输出和大小写转换
大家好啊这里是土豆的博客一个正在努力学习技术的大学生。上一篇我们聊了string的基础操作比如s.size()求长度、s[i]访问字符以及用循环遍历字符串。今天这篇就直接用几道小题来练一练。字符串题刚开始不用急着做复杂的先把遍历、判断、修改这些基础动作写顺后面会轻松很多。好了废话不多说咱们直接开始。第一题统计某个字符出现次数题目输入一个字符串再输入一个字符统计这个字符在字符串中出现了多少次。比如输入banana a输出3这道题其实和数组里统计某个数字出现次数很像。数组里是一个一个看数字字符串里是一个一个看字符。代码如下#include iostream using namespace std; int main() { string s; char ch; cin s; cin ch; int cnt 0; for(int i 0; i s.size(); i) { if(s[i] ch) { cnt; } } cout cnt; return 0; }这里最关键的地方是if(s[i] ch)i从 0 开始变化每次访问字符串中的一个字符。如果当前字符和目标字符相等就让cnt加 1。很多同学刚开始容易把写成。比较是否相等要用赋值才用写条件判断时可以多看一眼。这道题想练的是遍历字符串并在遍历过程中做判断和计数。第二题反向输出字符串题目输入一个字符串把它反过来输出。比如输入hello输出olleh这道题只需要倒着访问每个字符就可以。代码如下#include iostream using namespace std; int main() { string s; cin s; for(int i s.size() - 1; i 0; i--) { cout s[i]; } return 0; }这里最容易写错的是起点。如果字符串是hello长度是 5下标是0 1 2 3 4最后一个字符的下标是4也就是s.size() - 1所以反向输出时循环从s.size() - 1开始一直走到0。有些同学会写成for(int i s.size(); i 0; i--)这样一开始就访问了s[5]已经越界了。字符串和数组一样长度是n最后一个合法下标就是n - 1。这道题主要练的是反向遍历。后面做回文判断、逆序处理时经常会用到类似思路。第三题判断字符串是不是回文题目输入一个字符串判断它是不是回文。回文的意思是正着读和反着读一样比如level它就是回文。hello就不是回文。我们可以用两个下标来做一个从左边开始一个从右边开始。每次比较左右两个字符如果不一样就说明它不是回文。代码如下#include iostream using namespace std; int main() { string s; cin s; int left 0; int right s.size() - 1; bool ok true; while(left right) { if(s[left] ! s[right]) { ok false; break; } left; right--; } if(ok) { cout Yes; } else { cout No; } return 0; }这道题比前两题稍微多了一点思路但也不复杂只是需要注意下边界问题。比如字符串是level第一次比较s[0] 和 s[4]都是l。第二次比较s[1] 和 s[3]都是e。中间的v不用再和谁比较因为左右已经走到中间了。这里的left和right很像两个同学从两边往中间走每走一步就看当前字符是否一样。如果中途发现不一样就可以提前结束。这道题里面字符串不一定只能从左到右遍历有时候从两头往中间看会更方便。第四题把小写字母改成大写字母题目输入一个只包含小写字母的字符串把它全部转换成大写字母。比如输入hello输出HELLO代码如下这里用到了 ASCII 码。ASCII 码可以简单理解成计算机给常见字符安排的一张“编号表”。比如字符 A、B、a、b 在表里都有对应的数字编号。常见 ASCII 编码里A 65 B 66 C 67 a 97 b 98 c 99所以在 C 里单引号里的字符比如a、A本质上是一个char字符。它背后有对应的 ASCII 数字编号所以可以参与加减运算。比如c - a可以理解成99 - 97 2也就是说c比a往后数 2 位。再看这句代码s[i] s[i] - a A;如果s[i]是c那么计算过程可以理解成c - a A 99 - 97 65 67而 ASCII 码中67 对应的字符就是C。所以这句代码的作用就是先算出当前小写字母距离a有多远再从A开始往后移动相同的位置得到对应的大写字母。另外在 ASCII 码表里同一个字母的大写和小写编号相差 32a - A 32 b - B 32 c - C 32所以小写字母转大写字母也可以理解成把 ASCII 编号减去 32。比如a是 97减去 32 得到 65也就是A。不过写代码时用s[i] s[i] - a A;可读性更好因为一眼能看出来是在做“小写转大写”。总结今天这篇我们用几道小题练了字符串的基础操作统计某个字符出现次数。反向输出字符串。判断字符串是不是回文。把小写字母转换成大写字母。对于刚开始学 C 的同学来说字符串题的第一步就是把s.size()、s[i]和循环配合写熟。不用一开始就背很多字符串函数。先把遍历、判断、修改这些基本操作练顺后面遇到更复杂的字符串题也能慢慢拆开来写。那这篇就先到这里。如果觉得有帮助记得点赞、关注和收藏谢谢有什么问题欢迎在评论区留言我们一起交流。我们下篇见