我的句子回文代码(C++)有什么问题?
What is wrong with my sentence palindrome code (C++)?
下面的代码是一个句子回文检查器。我是一名新手程序员,所以我很难调试这段代码。它显示不正确的输出。
例如,如果句子是“一个人,一个计划,一条运河:巴拿马”
它给出的结果是 false 而不是 true。 (忽略空格和标点符号。)
#include <iostream>
class Solution
{
public:
bool isPalindrome(std::string s)
{
int l, i;
i = 0;
l = s.length();
while (i <= (l - 1))
{
if (s[i] == ' ' || ispunct(s[i]) == true)
i++;
else if (s[l - 1] == ' ' || ispunct(s[l - 1]) == true)
l--;
else if (tolower(s[i]) == tolower(s[l - 1]))
{
l--;
i++;
}
else
return false;
}
return true;
}
};
int main(void)
{
Solution s;
const std::string text = "Panama";
std::cout << s.isPalindrome(text);
return 0;
}
问题很可能是 character classification functions(例如 ispunct
)不是 return bool
结果.
他们 return 一个 int
其值可以是 any non-zero 值“真”。
这意味着像 ispunct(s[i]) == true
这样的条件对于标点符号实际上可能是 false
。
您需要使用例如ispunct(s[i]) != 0
(或只是简单的 ispunct(s[i])
)。
而且,这不是检查回文的方式。我建议使用以下代码:
#include <iostream>
int main() {
std::string str;
std::cin >> str;
for (auto i = 0, j = str.size() - 1; i < j; i++, j--) {
if (//check for punctuation) {
}
else if (str.at(i) != str.at(j)) {
//not a palindrome
break;
}
}
return 0;
}
下面的代码是一个句子回文检查器。我是一名新手程序员,所以我很难调试这段代码。它显示不正确的输出。 例如,如果句子是“一个人,一个计划,一条运河:巴拿马” 它给出的结果是 false 而不是 true。 (忽略空格和标点符号。)
#include <iostream>
class Solution
{
public:
bool isPalindrome(std::string s)
{
int l, i;
i = 0;
l = s.length();
while (i <= (l - 1))
{
if (s[i] == ' ' || ispunct(s[i]) == true)
i++;
else if (s[l - 1] == ' ' || ispunct(s[l - 1]) == true)
l--;
else if (tolower(s[i]) == tolower(s[l - 1]))
{
l--;
i++;
}
else
return false;
}
return true;
}
};
int main(void)
{
Solution s;
const std::string text = "Panama";
std::cout << s.isPalindrome(text);
return 0;
}
问题很可能是 character classification functions(例如 ispunct
)不是 return bool
结果.
他们 return 一个 int
其值可以是 any non-zero 值“真”。
这意味着像 ispunct(s[i]) == true
这样的条件对于标点符号实际上可能是 false
。
您需要使用例如ispunct(s[i]) != 0
(或只是简单的 ispunct(s[i])
)。
而且,这不是检查回文的方式。我建议使用以下代码:
#include <iostream>
int main() {
std::string str;
std::cin >> str;
for (auto i = 0, j = str.size() - 1; i < j; i++, j--) {
if (//check for punctuation) {
}
else if (str.at(i) != str.at(j)) {
//not a palindrome
break;
}
}
return 0;
}