C++ 回文字符串问题:为什么我必须放+;1而不是-1使此代码正常工作?

C++ 回文字符串问题:为什么我必须放+;1而不是-1使此代码正常工作?,c++,string,function,C++,String,Function,我正在做一个程序来检查一个字符串是否是回文的,起初它不工作,做了一些随机的事情使它工作,现在我不知道为什么它工作 代码如下: #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: "

我正在做一个程序来检查一个字符串是否是回文的,起初它不工作,做了一些随机的事情使它工作,现在我不知道为什么它工作

代码如下:

#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;
}
#包括
#包括
使用名称空间std;
int main()
{
字符串s,copie;//copie在罗马尼亚语中表示copy
int i,aux,OK;
沙发;
copie=s;
对于(i=0;i这是您的问题:

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

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

您的程序处理所有字符串的原因是,在循环中,您在交换字符时迭代字符串中的每个字符。这意味着,一旦通过了中间点,您就可以正在对已交换的字符执行操作并再次交换。本质上,您是通过再次反转字符串来撤消反转

另外,正如@PaulMcKenzie所说,您正在使用
copie.length()
作为循环的上限,这只是自找麻烦。对于普通数组,
i
的最后一个值将访问数组外的元素,这将抛出错误或访问未定义的值(取决于您运行此代码的平台。它仍然在这里工作的原因是C+使用隐式空字符(
\0
)终止字符串,而这正是您在使用
copie[copie.length()]时访问的内容。)
。通常,当您将空字符与第一个字符交换时,这会导致问题,但由于您稍后将其交换回,因此此行为会自行纠正

相反,您应该做的是迭代输入字符串的一半,以便进行反转,然后停止。此外,在处理任何字符串或数组时,请使用
copie.length()-1
,以获取最后一个索引中的元素:

for(i = 0; i < copie.length() / 2; i++)
{
  aux=copie[i];
  copie[i]=copie[copie.length()-1-i];
  copie[copie.length()-1-i]=aux;
}
for(i=0;i
用于(i=0;i@PaulMcKenzie那么,为什么它在我的编译器上对任何字符串都能完美地工作呢?使用
[]
访问是未定义的行为。您很幸运它能工作。要删除“luck”,请使用
at()
函数会告诉你所有的人都错了。@paulmckenzie他知道他错了:问题是为什么……思考未定义的行为是浪费时间。补充:我忘了在for(I=0;I)处添加/2“也就是说,你的代码可能更有效。但是,因为它看起来像是家庭作业,这与问题的重点无关。”出于好奇,它怎么能更有效呢?我想学习。@sirmyself不用反转字符串,你可以直接比较
[第一个字符]==[最后一个字符]
[第二个字符]==[第二个最后一个字符]
等等,一直到中间。一旦你得到不同,它就不是回文
for(i=0; i<=copie.length()+1; i++)
{
    aux=copie[i];
    copie[i]=copie[copie.length()-i+1]; // <<<<<
    copie[copie.length()-i+1]=aux;
}
for(i=0; i < copie.length(); i++)
{
    aux=copie[i];
    copie[i]=copie[copie.length()-(i+1)]; // <<<<<
    copie[copie.length()-(i+1)]=aux;
}
for(i = 0; i < copie.length() / 2; i++)
{
  aux=copie[i];
  copie[i]=copie[copie.length()-1-i];
  copie[copie.length()-1-i]=aux;
}