鱼C论坛

 找回密码
 立即注册
查看: 1784|回复: 2

[已解决]这是为什么啊,求帮助

[复制链接]
发表于 2017-10-9 15:14:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
判断字符串是否回文,回文就是顺读和逆读内容均相同的字符串。如“121”“abba”。代码如下:
[b][b]#include <stdio.h>
#include <stdlib.h>

#define MAX 20

int cycle(char *s);
int cycle(char *s)
{
    char *h, *t;

    for(h = s, t = s + strlen(s) - 1; t > h; h++, t--)
    {
        if(*h != *t)              //h数组第一位数,t为数组倒数第二位数,进行比较
        {
            break;
        }
    }

    return t <= h;

}

int main()
{
    char s[MAX];

    printf("请输入一个您想判断的字符串(输入#代表结束):");
    scanf("%s", s);

    if(s[0] == '#')
    {
        printf("谢谢您的使用,再见!\n");
        exit(1);
    }

    if(cycle(s))
    {
        printf("%s是一个回文字符串.\n", s);
    }
    else
    {
        printf("%s不是一个回文字符串.\n", s);
    }

    printf("谢谢您的使用,再见!\n");

    return 0;
}
[/b][/b]


不知道为什么那个判断函数里,t为什么会大于h,还有为什么要return t <= h啊
最佳答案
2017-10-9 16:35:38
你看for循环里的赋值,h是指向这个字符的头地址,t指向的是尾地址(因为t = s + strlen(s) - 1,strlen(s)是该字符串的长度,为什么要-1,比如4个元素,从3开始数,尾地址是6,你可以数一下,不会是7的)。
那么回文的意思就是第一个和最后一个相同,第二个和倒数第二个相同。那么你的问题1就可以解决了,因为要定位到头尾,去比较呀,然后头往后走,尾往前走,这样才可以相对应的比较呀。for循环里的判断就是在判断头尾的字符相不相同,要是有一组不相同立马退出,返回。
现在来说说你第二个问题,return t<=h,到main函数里就是 if( t<=h)(别在乎局部变量,全局变量,为了理解我只能这么说),如果有一组不相同,那么h和t肯定是不会碰面的,因为还没执行到碰面那一步就退出了循环,h没有++,t也没有--,停留在原地了;如果 if 里的条件满足,那么肯定是一起一组组比对过完成了匹配,知道走到中间一个或者中间一组(数组可以是奇数个,或者偶数个,如果是偶数个,匹配完后会在执行一次++、--运算,所以t就和h擦肩而过了,t<h)。既然都擦肩而过了,或者刚好碰面了,那说明前后的各个元素都对应起来才能走到一起呀。
道理就这么多,好好理解,不懂的点“回复”问,懂了点下“最佳答案”支持下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-9 15:47:08 | 显示全部楼层
1.t为什么大于h?
    如果输入的是"121", 那么字符串指针h = s(假如0x00402000);
    t = s + strlen(s) - 1 ; (t = 0x00402000 + 4 - 1 = 0x00402003)
    所以t>h
2.为什么要return t<=h?
   因为,如果输入的字符串是回文的,那么一定是比对完成的,所以t==h,就会return true;
   如果没有比对完成就break了,那个t是大于h的,就会return false;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-9 16:35:38 | 显示全部楼层    本楼为最佳答案   
你看for循环里的赋值,h是指向这个字符的头地址,t指向的是尾地址(因为t = s + strlen(s) - 1,strlen(s)是该字符串的长度,为什么要-1,比如4个元素,从3开始数,尾地址是6,你可以数一下,不会是7的)。
那么回文的意思就是第一个和最后一个相同,第二个和倒数第二个相同。那么你的问题1就可以解决了,因为要定位到头尾,去比较呀,然后头往后走,尾往前走,这样才可以相对应的比较呀。for循环里的判断就是在判断头尾的字符相不相同,要是有一组不相同立马退出,返回。
现在来说说你第二个问题,return t<=h,到main函数里就是 if( t<=h)(别在乎局部变量,全局变量,为了理解我只能这么说),如果有一组不相同,那么h和t肯定是不会碰面的,因为还没执行到碰面那一步就退出了循环,h没有++,t也没有--,停留在原地了;如果 if 里的条件满足,那么肯定是一起一组组比对过完成了匹配,知道走到中间一个或者中间一组(数组可以是奇数个,或者偶数个,如果是偶数个,匹配完后会在执行一次++、--运算,所以t就和h擦肩而过了,t<h)。既然都擦肩而过了,或者刚好碰面了,那说明前后的各个元素都对应起来才能走到一起呀。
道理就这么多,好好理解,不懂的点“回复”问,懂了点下“最佳答案”支持下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-30 21:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表