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
相关产品推荐
相关产品推荐

