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

C++回文判断函数疑问:视觉相等的字符串为何比较不相等?

问题:回文字符串判断逻辑异常——视觉相同的字符串判定不相等

我编写了如下C++函数用于判断字符串是否为回文(palindrome),执行后发现循环结束后打印的两个字符串视觉上完全相同,但比较逻辑却判定它们不相等,请帮忙解释原因。

代码示例

#include <iostream>
#include <string.h>

bool palindrome;

bool is_palindrome(std::string text){
  std::string backwards = "";
  for (int i = text.length();i >= 0; i--){
    backwards = backwards + text[i];
    std::cout << backwards << std::endl;
  }
  std::cout << backwards << " and " << text << std::endl;
  if (text == backwards){
    std::cout << "they are equal" << std::endl;
    palindrome = true;
  }
  else{
    std::cout << "they are not equal" << std::endl;
    palindrome = false;
  }
  return palindrome;
}

int main() {
  std::cout << is_palindrome("madam") << "\n";
}

执行输出

m
ma
mad
mada
madam
madam and madam
they are not equal
0

问题原因分析

核心问题:越界访问字符串的终止符

C++的std::string底层以**空字符'\0'**作为字符串的终止标志,字符串的有效字符下标范围是0到text.length()-1。你的循环起始条件是i = text.length(),此时访问text[i]会取到字符串末尾的空字符'\0',并将这个不可打印字符添加到了backwards的开头。

视觉相同的原因

空字符'\0'属于不可打印字符,在控制台输出时不会显示任何内容,所以你看到的backwards和text看起来完全一致,但实际上backwards的长度比text多1(多了一个开头的空字符)。

你可以添加长度打印验证:

std::cout << "text长度: " << text.length() << ", backwards长度: " << backwards.length() << std::endl;

执行后会看到text长度为5,backwards长度为6,长度不同的字符串自然判定为不相等。

修复方案

修改循环的起始下标,从最后一个有效字符开始遍历:

for (int i = text.length() - 1; i >= 0; i--) {
    backwards = backwards + text[i];
}

内容的提问来源于stack exchange,提问作者krogerson2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:24:54