判断输入的字符串是否为“回文”|回文判断【C语言】

这篇博客介绍了如何编写C语言程序来判断输入的字符串是否为回文,包括使用`gets()`和`fgets()`函数的不同实现,并讨论了处理中文字符时的注意事项。程序能够正确判断全中文回文字符串,但在处理混合字符时存在局限性。文章提出了对混合中文和其他字符的字符串判断的挑战,引发对字符串处理的进一步思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求判断输入的字符是否为回文(“回文”,即正读反读都是一样的,例如noon, civic, radar或者风扇能扇风 ,奶牛产牛奶等都属于回文)

编写程序:

#include<stdio.h>
#include<string.h>
int main(void) {
	int i, sign=1, length; 	//符号变量sign
	char str[10];			//定义一个字符数组
	printf("输入长度不超过10的字符串:\n");
	gets(str);				//直接接收一个字符串并存入数组(需先导入string.h)
	length=strlen(str);		//测量所输入字符串的长度
	for(i=0; i<length/2; ++i) {
		if(str[i]!=str[length-1-i])		//从两端开始比较每一个字符是否相等
                        //length-1是因为strlen是计算的字符个数,而数组下标是从0开始的,下同
			sign=0;
		break;				//如果对比时出现不相等情况,使sign置0并立即跳出循环
	}
	if(sign) printf("该字符串是回文");	//通过sign值判断该字符串是否为回文
	else  printf("该字符串不是回文");
	return 0;
}

//改用fgets()
#include <stdio.h>
#include <string.h>
int main(void) {
	int i, sign=1, length;
	char str[11];
	printf("输入长度不超过10的字符串:\n");
	fgets(str, sizeof(str), stdin);
	length = strlen(str)-1;		// 不计算fgets输入时,末尾的'\n' '\0'
	for (i=0; i<length/2; i+=1) {
		if (str[i] != str[length-1-i]) {
			sign=0;
			break;
		}
	}
	if (sign) printf("该字符串是回文");
	else  printf("该字符串不是回文");
	return 0;
}
/*由于 fgets() 函数接收的输入字符串会包含换行符 \n,因此需要对其进行额外的处理,将末尾的 \n 替换成 \0*/

输入一个不是回文的字符串:

输入一个是回文的字符串:

========但该程序无法正确判断有中文字符的情况==========

一下程序可以实现对全中文字符串的判断和部分含其他字符的字符串的判断:

#include<stdio.h>
#include<string.h>
int main(void) {
	int i, sign=1, length; 	//符号变量sign
	char str[20];			//定义一个字符数组
	printf("输入长度不超过10个汉字:\n");
	gets(str);				//直接接收一个字符串并存入数组(需先导入string.h)
	length=strlen(str);		//测量所输入字符串的长度
	if(str[i]!=str[length-2-i]&&str[i+1]!=str[length-1-i]) {		//从两端开始比较每一个汉字(每两个字节)是否相等
		sign=0;
		break;
	}			//如果对比时出现不相等情况,使sign置0并立即跳出循环
	if(sign) printf("该字符串是回文");	//通过sign值判断该字符串是否为回文
	else  printf("该字符串不是回文");
	return 0;
}

可以看出我只是修改了程序中对输入的字符串判断的部分。因为中文字符占两个字节(其他字符一般占一个字节),我们将两个连续的字符连起来判断即可。

但这样做也会有缺点,那就是无法对中文字符中又有其他字符的字符串进行正确的判断。

运行上面的代码就会出现下面两种“神奇”的情况:

情况1:有其除中文外的他字符,但正确判断了

情况2:有其除中文外的他字符,判断错误

 其实这并不“神奇”,因为我们现在将每两个看成一个字符……点到为止,你可以自行思考。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.魚肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值