我有一个关于在C ++中比较字符串的问题。我的下面的代码应该检查一个单词是否是回文(向前和向后拼写相同的方式)。问题是我的if语句(s1 == s2)永远不会计算为true。我觉得在内存中这两个字符串是不同的,但我没有任何具体的证据。有什么建议?谢谢!
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2;
cin >> s1;
for(int i = 0; i <= s1.size(); i++){
s2.push_back(s1[(s1.size() - i)]);
}
cout << s1 <<endl;
cout << s2 <<endl;
if(s1 == s2){
cout << "Correct" <<endl;
}
else {
cout << "Incorrect" <<endl;
}
return 0;
}
答案 0 :(得分:4)
这超出了字符串的范围
for(int i = 0; i <= s1.size(); i++){
s2.push_back(s1[(s1.size() - i)]);
}
字符串只有0..size()-1
范围内的字符。你是在计算和索引一个位置太远了。
答案 1 :(得分:3)
但你应该更好地使用以下代替你的循环:
s2.assign(s1.rbegin(), s2.rend());
答案 2 :(得分:1)
您的问题不在字符串比较中。看看你是如何构建反向字符串的。
答案 3 :(得分:0)
在您的情况下,索引超出范围。这是正确的代码(我用1初始化,而不是0):
for(int i = 1; i <= s1.size(); i++){
s2.push_back(s1[(s1.size() - i)]);
}
答案 4 :(得分:0)
你可能意味着s1.size() - i - 1
。
答案 5 :(得分:0)
因为i
从0开始,您将访问s1[s1.size()-0]
,这将返回空字符。请注意,建议您使用s1.size() - i - 1
的解决方案错误,因为您正在迭代并包括s1.size()
,这意味着您将在某个时候访问s1[-1]
。这比访问s1[s1.size()]
要糟糕得多,因为行为未定义。开始迭代1,然后你可以保持其余的代码不变(但请缩进它!)。
正如其他人所提到的,将s2
定义为std::string s2(s1.rbegin(), s1.rend());
更加清晰。
答案 6 :(得分:-4)
ofcourse。你正在比较两个变量的指针。 你应该使用strcmp功能
修复:您需要使用: string::compare
祝你好运