C++编写整数回文判断代码时相同字符串compare返回非0问题
问题原因
核心bug出在反转字符串的循环下标边界写错了:
- C++
std::string的有效字符下标范围是0到字符串长度-1,下标等于length()的位置返回的是值为\0的空字符,这个字符是不可打印的,终端输出时不会显示肉眼可见的内容。 - 你写的循环初始值设为
i = num.length(),第一次迭代就把这个不可见的\0拼到了rev的最开头,之后才依次拼接原字符串的最后1位、倒数第2位……直到第0位的字符。 - 以输入n=101为例,
num是长度为3的字符串,实际存储内容为['1','0','1'];循环生成的rev实际长度为4,存储内容为['\0','1','0','1']。由于cout输出std::string时会输出所有存储的字符,开头的\0不可见,你肉眼看到的输出就是101 101,完全察觉不到隐藏字符,但两个字符串长度、实际内容都不相等,compare方法自然不会返回0。你之前单独测试整数转字符串比较逻辑正常,是因为那些场景下生成的字符串没有带这类多余的隐藏字符,和转字符串逻辑本身无关。
修复方案
调整循环的下标边界即可,从原字符串最后一个有效下标开始遍历:
// 把循环初始值从num.length()改成num.length()-1 for(int i = num.length() - 1; i >= 0; i--) { rev += num[i]; }
如果不想手动写反转逻辑,也可以直接用标准库提供的反转函数,从根源避免下标写错的问题,需要先引入<algorithm>头文件:
#include <algorithm> // 生成反转字符串的代码可以替换成 string rev = num; reverse(rev.begin(), rev.end());
你要是想验证这个隐藏字符的存在,可以在比较前加一句打印两个字符串长度的代码,就能看到rev的长度比num多1。
内容的提问来源于stack exchange,提问作者Anees Patel
相关产品推荐
相关产品推荐

