C++回文判断代码中for循环索引起始值为何要减1
C++回文判断代码中,为什么反转字符串的循环初始值要写
text.size() - 1? 我在校期间已经学习过C++,近期正在学习Codecademy的C++入门课程。平台上有一道回文单词判断的习题,要求编写函数返回true或false的判断结果。我没能独立解出这道题,查看给出的参考答案如下:
#include <iostream> // 在此处定义is_palindrome()函数: bool is_palindrome(std::string text) { std::string reversed_text = ""; for (int i = text.size() - 1; i >= 0; i--) { reversed_text += text[i]; } if (reversed_text == text) { return true; } return false; } int main() { std::cout << is_palindrome("madam") << "\n"; std::cout << is_palindrome("ada") << "\n"; std::cout << is_palindrome("lovelace") << "\n"; }
我唯一的疑问针对循环部分的代码:
for (int i = text.size() - 1; i >= 0; i--) { reversed_text += text[i]; }
我知道这段逻辑是通过字符串索引取值实现反转,但无法理解为什么要对text.size()做减1操作,希望有人能解释其中的逻辑。
提前感谢所有阅读本帖的解答者。我是意大利用户,这是我首次使用Stack Overflow,若我的表达或平台使用方式不够规范,还请谅解。
解答
这是C++(以及绝大多数编程语言)字符串、数组的通用索引规则决定的:所有序列的索引都是从0开始计数,而非从1开始。
拿样例里的"madam"举例:
- 这个单词一共5个字符,调用
text.size()会返回长度值5 - 但5个字符对应的合法索引范围是
0到4,不是1到5:- 索引0对应第一个字符
'm' - 索引1对应第二个字符
'a' - 索引2对应第三个字符
'd' - 索引3对应第四个字符
'a' - 索引4对应第五个(也就是最后一个)字符
'm'
- 索引0对应第一个字符
这个倒序循环的目的是从字符串末尾往头部逐个取字符,拼接出反转后的字符串。如果初始值直接写text.size()也就是5,访问text[5]就超出了字符串的合法内存范围,会触发未定义行为——可能读到乱码,也可能直接导致程序崩溃。
所以初始值要写text.size() - 1,刚好定位到字符串最后一个字符的位置,之后每次循环i减1往前移动一位,直到i >= 0取到第一个字符,就能完整遍历整个字符串,得到正确的反转结果。
内容的提问来源于stack exchange,提问作者Andrea Corvo
相关产品推荐
相关产品推荐

