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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38603541/article/details/85019340

例题一:

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

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

函数接口定义:

bool palindrome( char *s );

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

裁判测试程序样例:

#include <stdio.h>
#include <string.h>

#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是否相等,就能判断该字符串是否为回文字符串。

猜你喜欢

转载自blog.csdn.net/qq_38603541/article/details/85019340