首页 > 解决方案 > 回文字符串问题:为什么我必须放 +1 而不是 -1 才能使这段代码工作?

问题描述

我正在制作一个程序来检查一个字符串是否是回文并且它一开始没有工作,做了一些随机的事情让它工作,现在我不知道它为什么工作。

这是代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
string s, copie; //copie means copy in romanian
int i, aux, OK;
cout<<"Enter the string/word: "; cin>>s;
copie=s;
for(i=0; i<=copie.length()+1; i++)
{
    aux=copie[i];
    copie[i]=copie[copie.length()-i+1];
    copie[copie.length()-i+1]=aux;
}
OK=1;

for(i=0; i<s.length(); i++)
    if(s[i]!=copie[i])
        OK=0;
if(OK==1)
    cout<<"yes";
else
    cout<<"no";
return 0;
}

现在通常应该是

for(i=0; i<=copie.length()-1; i++) 

或者

for(i=0; i < copie.length(); i++) 

因为字符串是从 0 开始索引的,字符串的最后一个字符是它的长度减 1。但它一开始没有用,所以我添加了一些 couts 来检查出了什么问题(我们可以说是出于调试目的)并且副本丢失了前两个字符。例如,如果我输入“cojoc”,我会得到“@joc”。就像wtf?然后将 < 更改为 <= 并得到 ojoc,所以我在最后添加了 +1 并且它可以工作。但它不应该,所以我问为什么会这样?我错过了什么吗?

标签: c++stringfunction

解决方案


这是你的问题:

for(i=0; i<=copie.length()+1; i++)
{
    aux=copie[i];
    copie[i]=copie[copie.length()-i+1]; // <<<<<
    copie[copie.length()-i+1]=aux;
}

通过计算这个索引 ( [copie.length()-i+1]),你减去i然后加 1 到长度。您可能认为您减去i和 1 的总和,但减法在数学或编程中并不像那样工作。

使用括号将解决您的问题:

for(i=0; i < copie.length(); i++)
{
    aux=copie[i];
    copie[i]=copie[copie.length()-(i+1)]; // <<<<<
    copie[copie.length()-(i+1)]=aux;
}

也就是说,您的代码可能会更有效。但是,因为它看起来像家庭作业,所以这不是问题的重点。


推荐阅读