c语言来实现判断回文,解题思路

判断字符串是否是回文,子函数回文里面的指针*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代表传入函数的数组的首元素地址。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: C语言期末考试内容(2)选择填空答案整理(基础章节内容附解析)中的 2. 指针操作数据也是不用返回数值的,因为通过指针访问数据是可以通过==*P==直接修改变量数值的,自然就不需要再把值返回给主函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
  • 以下回答来自chatgpt:

    我可以使用以下方式来判断一个字符串是否为回文:

    #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 同一个地址。这时,在下一步操作中,pe 将开始向相反方向移动,直至相遇,判断字符串是否为回文。

    palindrome 函数中,第一个 while 循环实现了移动指针 pe 直至相遇的功能,第二个和第三个 while 循环则实现了将指针 pe 移动到第一个字母的位置的功能。

    具体来说,第二个 while 循环将指针 p 向后移动,直至指向第一个字母或数字位置;第三个 while 循环将指针 e 向前移动,直至指向第一个字母或数字位置。这样可以避免在比较时受到非字母或数字字符的影响。

    对于 palindrome 函数中的每一个步骤,我解释如下:

    1. pe 指向字符串的开头和结尾
    char *p = str;
    char *e = str + strlen(str) - 1;
    

    指针 p 指向字符串的开始位置,指针 e 指向字符串的结尾位置。由于需要比较 pe 所指向的字符,所以需要知道字符串的长度。

    1. 移动 pe 直至相遇或错过第一个字母
    while (p < e) { 
        while (!isalnum(*p) && p < e) p++;
        while (!isalnum(*e) && p < e) e--;
        // ...
    }
    

    如果 pe 没有相遇时,执行内部的操作。第一个 while 循环判断 p 所指向的字符是否为字母或数字,如果不是,则将 p 指向下一个字符,直至指向第一个字母或数字或者与 e 相遇。

    第二个 while 循环同理,判断 e 所指向的字符是否为字母或数字,如果不是,则将 e 指向前一个字符,直至指向第一个字母或数字或者与 p 相遇。

    1. 比较 pe 所指向的字符是否相等
    if (tolower(*p++) != tolower(*e--)) { 
        return 0;
    }
    

    如果指针 p 和指针 e 所指向的字符不相等,返回 0,表示不为回文;否则继续执行第二步。为了避免大小写对比造成的干扰,我们将字符转换为小写比较。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^