使用指针算术更新值的 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
我正在编写一个 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