c语言回文字符串用指针,C语言-判断回文字符串【函数+指针】(一)

例题一:

6-1 判断回文字符串 (20 分)

本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。

函数接口定义:

bool palindrome( char *s );

函数palindrome判断输入字符串char *s是否为回文。若是则返回true,否则返回false。

裁判测试程序样例:

#include

#include

#define MAXN 20

typedef enum {false, true} bool;

bool palindrome( char *s );

int main()

{

char s[MAXN];

scanf("%s", s);

if ( palindrome(s)==true )

printf("Yes\n");

else

printf("No\n");

printf("%s\n", s);

return 0;

}

/* 你的代码将被嵌在这里 */

输入样例1:

thisistrueurtsisiht

输出样例1:

Yes

thisistrueurtsisiht

输入样例2:

thisisnottrue

输出样例2:

No

thisisnottrue

这道题给的裁判测试样例是使用C语言的指针写的,所以,在函数中,我们依然还是使用指针操作比较简单,我先把源码放在下面我们再来分析:

bool palindrome(char *s){ //定义返回值为布尔类型的函数

char *a = s;//定义一个新指针指向s

int i = 0,j=0,k=0;

while (*a != '\0'){ //使用指针a最字符串进行遍历,统计字符串位数

a++;

i++;

}

a--; //因为最后一位为'\0'所以减一位

while (*s != '\0'){ //进行两个比较

if (*s == *a){

k++;

}

else{

return false;//在遍历过程中有对应不相等的项,直接返回false

}

s++;//指针s正向遍历与a进行比较

a--;//指针a反向遍历与s进行比较

}

if (k == i){ //如果k与i相等则说明在遍历过程中字符串正向与反向对应相等,返回true

return true;

}

}

现在来讲思路:回文字符串的意思就是字符串首尾对应相等,那么我们在处理该问题的过程中就要存在一个正向与反向的问题,所以说在程序中,我们重新定义一个指针a指向s,重新定义一个指针的目的就是为了做比较来使用,因为指针不像数组那样可以直接逆向进行操作,现在有了一个新指针,其实在新定义的指针a与指针s完全相等,但是执行统计字符之后,指针a指向的是字符串的最后一个字符。首先在函数里面,先对字符串进行字符个数统计,统计结束之后,保存统计数据,后面会用到。然后就是两个字符串的双向比较了,在比较过程中一旦发现不相等的情况直接返回false,表是该字符串不是回文串,在没有发现此类情况的时候,一直进行这比较,并且两个指针指向的字符始终进行着是否等价的比较,直至指针s指向了字符串的结束符。最后再加一个判断,就是k和i是否相等,为什么k和i相等了,就说明字符串是回文串了呢,因为在程序中呢,k始终是记录着s与a是否相等的,而i呢又是遍历字符串之后整个字符串的长度,所以说,只要判断了k和i是否相等,就能判断该字符串是否为回文字符串。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值