判断字符串是否是回文,子函数回文里面的指针*e=p是什么意思啊,两个while分别是什么功能,可以讲一下子函数每一步的作用吗
#include <stdio.h>
int huiwen(char *p);
int main(void)
{
int i=0,flag;
char str[80];
printf("请输入字符串:");
while((str[i]=getchar())!='\n')
i++;
str[i]='\0';
flag=huiwen(str);
if(flag==1)
printf("%s是回文\n",str);
else
printf("%s不是回文\n",str);
}
int huiwen(char *p)
{
char *e=p;
while(*e)
e++;
--e;
while(p<e&&*p==*e)
{
p++;
e--;
}
if(p>=e)
return 1;
return 0;
}
回文的判断,就是 首尾字符依此往中间靠,然后分别判断,有不一致的字符,就不是回文串
第一个while循环是为了 输入这个待判断的 字符串
子函数的解释如下:
int huiwen(char *p)
{
char *e=p; // 把字符指针p 赋值给字符指针 e
while(*e)
e++; // 字符指针e 往后移动,直到遇到 *e == '\0'结束
--e; // 再减1,表示最后一个字符
while(p<e&&*p==*e) // 首 和 尾 比较,p < e 说明 还没到中间,*p==*e 表示首尾字符相等
{
p++; // p 前进一个,往中间靠
e--; // e 后退一个,往中间靠
}
if(p>=e) // 循环结束,p >= e 表示 这就是回文字符串
return 1; // 返回1:回文字符串
return 0; // 返回 0:不是回文字符串
}
*e=p,表示把p的地址赋值给e这个指针变量,p代表传入函数的数组的首元素地址。
不知道你这个问题是否已经解决, 如果还没有解决的话:我可以使用以下方式来判断一个字符串是否为回文:
#include <stdio.h>
#include <string.h>
int palindrome(char *str) {
char *p = str; // 指针p指向字符串开头
char *e = str + strlen(str) - 1; // 指针e指向字符串结尾
while (p < e) { // p小于e时,循环
while (!isalnum(*p) && p < e) p++; // 如果*p不是字母或数字,p向后移动一位
while (!isalnum(*e) && p < e) e--; // 如果*e不是字母或数字,e向前移动一位
if (tolower(*p++) != tolower(*e--)) { // 如果*p和*e不相等,返回0
return 0;
}
}
return 1;
}
在上述函数中,指针 e
赋值为 p
的含义是将指针 e
指向与指针 p
同一个地址。这时,在下一步操作中,p
和 e
将开始向相反方向移动,直至相遇,判断字符串是否为回文。
在 palindrome
函数中,第一个 while
循环实现了移动指针 p
和 e
直至相遇的功能,第二个和第三个 while
循环则实现了将指针 p
和 e
移动到第一个字母的位置的功能。
具体来说,第二个 while
循环将指针 p
向后移动,直至指向第一个字母或数字位置;第三个 while
循环将指针 e
向前移动,直至指向第一个字母或数字位置。这样可以避免在比较时受到非字母或数字字符的影响。
对于 palindrome
函数中的每一个步骤,我解释如下:
p
和 e
指向字符串的开头和结尾char *p = str;
char *e = str + strlen(str) - 1;
指针 p
指向字符串的开始位置,指针 e
指向字符串的结尾位置。由于需要比较 p
和 e
所指向的字符,所以需要知道字符串的长度。
p
和 e
直至相遇或错过第一个字母while (p < e) {
while (!isalnum(*p) && p < e) p++;
while (!isalnum(*e) && p < e) e--;
// ...
}
如果 p
和 e
没有相遇时,执行内部的操作。第一个 while
循环判断 p
所指向的字符是否为字母或数字,如果不是,则将 p
指向下一个字符,直至指向第一个字母或数字或者与 e
相遇。
第二个 while
循环同理,判断 e
所指向的字符是否为字母或数字,如果不是,则将 e
指向前一个字符,直至指向第一个字母或数字或者与 p
相遇。
p
和 e
所指向的字符是否相等if (tolower(*p++) != tolower(*e--)) {
return 0;
}
如果指针 p
和指针 e
所指向的字符不相等,返回 0
,表示不为回文;否则继续执行第二步。为了避免大小写对比造成的干扰,我们将字符转换为小写比较。