如何判断一个字符串是不是中文
题面上说汉字的第一个字节的取值范围是0x80~0xFF
,但是这里有一个问题需要注意,str
是一个char类型的数组,str[i]
就是一个char类型的元素。char类型是一个有符号数,不能直接和0x80
作比较。
因为当str[i]
是汉字的第一个字符时,str[i]作为一个无符号数时才落在0x80~0xFF
,所以需要把str[i]
强制转换成无符号char类型。
if((unsigned char)str[i] >= 0x80)
{
}
代码一:
bool isPalindrome(char str[])
{
int len = strlen(str);
for(int i=0,j=len-1;i<j;)
{
if((unsigned char)str[i] >= 0x80) // 汉字首字节
{
bool is_same = (str[i]==str[j-2] &&str[i+1]==str[j-1] &&str[i+2]==str[j]);
if(!is_same)return false;
i+=3,j-=3;
}
else
{
char a = str[i];
char b = str[j];
if('A' <= a && a <= 'Z') a+=32;//忽略大小写
if('A' <= b && b <= 'Z') b+=32;//忽略大小写
if(a!=b)return false;
i++,j--;
}
}
return true;
}
解读:
一,用strlen
函数直接获取字符串长度,需要包含string.h
头文件。不要再用下面的代码了。
int i = 0;
while(str[i] != '\0')
{
i++;
}
二,对称轴两端的字符遍历用i和j两个下标:
for(int i=0,j=len-1;i<j;)
{
}
不要只用一个下标,然后用len-1-i计算对称轴另一端下标,很麻烦。
三,注意汉字判定,首字节转换成无符号数:
if((unsigned char)str[i] >= 0x80) // 汉字首字节
{
}
四,当字符不是汉字时,使用下面的代码可以忽略大小写判断是否相等:
char a = str[i];
char b = str[j];
if('A' <= a && a <= 'Z') a+=32;//忽略大小写
if('A' <= b && b <= 'Z') b+=32;//忽略大小写
if(a!=b)return false;
这里直接把英文字符全部转换成小写了。