c++ - 回文字符串问题:为什么我必须放 +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 并且它可以工作。但它不应该,所以我问为什么会这样?我错过了什么吗?
解决方案
这是你的问题:
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;
}
也就是说,您的代码可能会更有效。但是,因为它看起来像家庭作业,所以这不是问题的重点。
推荐阅读
- python - Pandas 数据框 - 按来自另一个数据框的值过滤行
- numpy - 向量化正则化梯度下降未通过数值检查
- postgresql - 从第一个查询中创建的行获取串行 PK 以查询另一个表
- automation - 自动化 Fortify SSC 报告
- java - Java中枚举内的EnumSet修饰符
- github - CODEOWNERS 语法:/foobar/** vs /foobar/
- import - 如何导入整个three.js核心库?
- python - 数组赋值如何在 python 函数中工作?
- virtualdub - virtualdub 剪辑视频的脚本
- python - 我正在尝试对这个网站进行图像抓取,但我正在抓取的网站似乎没有通过实际输出图像来响应