C++ C++;回文无效

C++ C++;回文无效,c++,function,for-loop,if-statement,C++,Function,For Loop,If Statement,我想创建一个函数,根据输入是否为回文返回true/false,当给定abcddcba或aba时,它不会给出true,但应该给出。plz帮助 bool checkPalindrome(char input[],int p=0) { if(input[1]=='\0'){ return true; } if(sizeof(input)%2==0) { int a = sizeof(input); for(int i=0;i&

我想创建一个函数,根据输入是否为回文返回true/false,当给定abcddcba或aba时,它不会给出true,但应该给出。plz帮助

bool checkPalindrome(char input[],int p=0) {
    if(input[1]=='\0'){
        return true;
    }
    if(sizeof(input)%2==0) { 
        int a = sizeof(input); 
        for(int i=0;i<(a/2);i++) {  
            if(input[0+i]==input[a-i-2]){
                p++;
            }
        }
        if(p==a/2){
            return true;
        } else{
            return false;
        }
    }
    else{
        int a = sizeof(input); 
        for(int i=0;i<((a-1)/2);i++)
        {
            if(input[0+i]==input[a-i-2]){
                p++;
            }
        }
        if(p==(a-1)/2){
            return true;
        } else{
            return false;
        }
    }
}
bool checkPalindrome(字符输入[],int p=0){
如果(输入[1]='\0'){
返回true;
}
如果(sizeof(input)%2==0){
int a=sizeof(输入);

对于(inti=0;i您的代码太长了。有一种简单的方法:在字符串的元素上迭代一次,比较n-1与0,n-2与1,依此类推

如果两个字符不相同,则返回false,否则继续检查:

bool checkPalindrome(char* str) {
    const int size = strlen(str);
    for(int i(0), j(size) - 1); i < size / 2; i++, j--)
        if(str[i] != str[j])
            return false;
    return true;
}

int main(){

    char* str = "level";
    cout << checkPalindrome(str);

    cout << endl << endl;
    return 0;
}
bool检查回文(char*str){
常量int size=strlen(str);
对于(inti(0),j(size)-1;i
bool checkPalindrome(const std::string& str)
{
    size_t len = str.size();
    for (size_t i = 0; i < len/2; i++)
    {
        if (str[i] != str[len-1-i])
            return false;
    }
    return true;
}
bool检查回文(const std::string&str)
{
大小长度=长度大小();
对于(大小i=0;i
C风格:

bool checkPalindrome(const char* str)
{
    size_t len = str ? strlen(str) : 0;
    for (size_t i = 0; i < len/2; i++)
    {
        if (str[i] != str[len-1-i])
            return false;
    }
    return true;
}
bool检查回文(const char*str)
{
长度=str?strlen(str):0;
对于(大小i=0;i

在这两种情况下,您可能需要评估(询问)空字符串是否应被视为回文。

基于字符串和迭代器的C++版本(仅为完整起见,其他答案已经非常好):

解释:迭代器
p
从字符串前面开始,
q
在后面(在最后一个字符之后)。
p
将前进,而
q
将后退。如果
p
达到
q
或者
p
已经通过
q
(如果单词长度为偶数,则为特例),结束,我们可以得出回文。但如果之前,
p
处的字符与
q
之前的字符有任何区别,则它不是回文


如果您以前从未使用过调试器,现在是学习如何使用调试器的最佳时机。使用调试器,您可以在监视变量及其值的同时逐行检查代码。我还建议您花一些时间阅读Eric Lippert的文章。
sizeof(input)
将返回
sizeof(char*)
(inti=0;i4
8
,这取决于OP是在32位还是64位系统上。您必须使用
strlen()获取字符串的长度,而不是<代码> SigeOs。但是应该使用<代码> STD::String < /Cord>而不是C字符串。在for循环的每次迭代中,您都会调用“代码> StrLin < /C>”,这会导致性能损失。您也需要做两次比较。很好!但是如果这是C++问题,如果我们在2017,那么可以这样做。我可以解释一下为什么我们不使用
string
,但仍然使用
char*
?@Christophe:使用string更安全、更容易,但我只保留了OP的代码。
bool checkPalindrome(const string& str) {
    for (auto p = str.begin(),q = str.end();  p!=q && p!=q+1; p++ ) 
        if (*p!=*--q)       // if char from front doesn't match char from rear ?
            return false;   // then it's not a palindrome !
    return true;
}