使用指针算术更新值的 C 递归函数,但不更新指针算术值

C recursive function using pointer arthimatic updates values, but not pointer arthimatic values

我正在编写一个 C 函数来检查字符串是否为回文。它接受一个指向字符串的指针,以及一个表示字符串长度的整数。我的想法是,我会检查字符串开头和结尾的字符,如果它们相同,则增加指针,减少长度,并一直检查直到它们相等或长度变为0(这可能是不正确的基本情况)。

我担心的是,当函数被调用时,char 指针递增没有问题,我可以通过查看正确的 chars 看到它。长度 int 像它应该的那样递减。但是,当我使用语句 *(p_string + length - 1) 时,它会一遍又一遍地查看同一个字符,尽管指针 p_string 和长度 int 都在每次函数调用时正确更新。甚至尝试 *(p_string + length) 产生同样的问题。

我不明白为什么如果长度和 p_string 都被正确更新,那么这个语句会一遍又一遍地 return 相同的字符。

代码:

int is_palindrome(char* p_string, int length)
{
    //This is a test statement, the "length - 1" everywhere is to avoid looking at the '[=10=]' character
    //during the first call
    printf("%c %c %d %p\n", *(p_string), *(p_string + length - 1), (length - 1), (p_string + length));
    if (length == 0)
    {
        return 1;
    }
    else if (*(p_string) != *(p_string + length - 1))
    {
        return 0;
    }
    else
    {
        return is_palindrome((p_string + 1), (length - 1));
    }

}

int main()
{
    char* p_string = "tacocat";
    printf("\n%d", is_palindrome(p_string, 7));

    return 0;
}

主要问题是您在此调用中使用了不正确的表达式作为第二个参数

return is_palindrome((p_string + 1), (length - 1));
                                     ^^^^^^^^^^^^

你至少需要写

return is_palindrome((p_string + 1), (length - 2));
                                     ^^^^^^^^^^^^

也代替这个检查

if (length == 0)
{
    return 1;
}

你应该使用支票

if (length < 2)
{
    return 1;
}

该函数应按以下方式声明

int is_palindrome( const char *s, size_t n )
{
    return ( n < 2 ) || ( *s == *( s + n - 1 ) && is_palindrome( s + 1, n - 2 ) );
} 

这是一个演示程序。

#include <stdio.h>
#include <string.h>

int is_palindrome( const char *s, size_t n )
{
    return ( n < 2 ) || ( *s == *( s + n - 1 ) && is_palindrome( s + 1, n - 2 ) );
} 

int main(void) 
{
    const char *s = "1";
    
    printf( "\"%s\" is a palindrome: %s\n", 
            s, is_palindrome( s, strlen( s ) ) ? "true" : "false" );

    s = "12";
    
    printf( "\"%s\" is a palindrome: %s\n", 
            s, is_palindrome( s, strlen( s ) ) ? "true" : "false" );
            
    s = "121";
    
    printf( "\"%s\" is a palindrome: %s\n", 
            s, is_palindrome( s, strlen( s ) ) ? "true" : "false" );
            
    s = "1221";
    
    printf( "\"%s\" is a palindrome: %s\n", 
            s, is_palindrome( s, strlen( s ) ) ? "true" : "false" );
            
    return 0;
}

程序输出为

"1" is a palindrome: true
"12" is a palindrome: false
"121" is a palindrome: true
"1221" is a palindrome: true