You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:57:15