要求判断输入的字符是否为回文(“回文”,即正读反读都是一样的,例如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:有其除中文外的他字符,判断错误
其实这并不“神奇”,因为我们现在将每两个看成一个字符……点到为止,你可以自行思考。