实训4 回文字符串检测
任务描述:编写C程序,判断输入的字符串是否为回文(正读和反读相同)。
学习目标:掌握字符数组、指针操作及字符串处理函数的使用。
任务要求:
Ø 支持英文字符串(如”level”)和中文(如”上海自来水来自海上”);
Ø 忽略空格和大小写(选做);
Ø 使用指针或数组实现字符串反转比较。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 函数声明:判断字符串是否为回文
int isPalindrome(char *str);
// 函数声明:跳过空格(移动指针)
void skipSpace(char **ptr, int direction); // direction: 1向前移, -1向后移
// 函数声明:比较两个字符(支持中英文,忽略英文大小写)
int compareChars(char *left, char *right);
int main() {
char str[200]; // 足够存储中英文混合字符串
printf(“请输入要检测的字符串(支持中英文):”);
fgets(str, sizeof(str), stdin); // 读取输入(包含空格)
str[strcspn(str, “\n”)] = ‘\0’; // 去除输入末尾的换行符
if (isPalindrome(str)) {
printf(“\”%s\” 是回文字符串!\n”, str);
} else {
printf(“\”%s\” 不是回文字符串!\n”, str);
}
return 0;
}
// 核心函数:判断是否为回文(使用前后指针)
int isPalindrome(char *str) {
if (strlen(str) == 0) return 1; // 空字符串视为回文
char *front = str; // 前指针(从头部开始)
char *rear = str + strlen(str) – 1; // 后指针(从尾部开始)
while (front < rear) {
// 跳过前指针遇到的空格
skipSpace(&front, 1);
// 跳过后指针遇到的空格
skipSpace(&rear, -1);
// 若指针交叉,说明已检测完所有有效字符
if (front >= rear) break;
// 比较当前前后指针指向的字符
if (!compareChars(front, rear)) {
return 0; // 字符不匹配,不是回文
}
// 移动指针(根据字符类型决定移动1或2字节)
if ((unsigned char)*front < 128) {
// 单字节字符(英文/符号)
front++;
rear–;
} else {
// 双字节字符(中文)
front += 2;
rear -= 2;
}
}
return 1; // 所有字符匹配,是回文
}
// 辅助函数:跳过空格(支持中英文空格)
void skipSpace(char **ptr, int direction) {
while (** ptr != ‘\0’) {
// 匹配英文空格或中文空格(中文空格ASCII码为160)
if ((unsigned char)**ptr == ‘ ‘ || (unsigned char)** ptr == 160) {
*ptr += direction; // 按方向移动指针
} else {
break; // 非空格则停止
}
}
}
// 辅助函数:比较两个字符(支持中英文,忽略英文大小写)
int compareChars(char *left, char *right) {
// 判断是否为双字节字符(中文)
if ((unsigned char)*left >= 128 && (unsigned char)*right >= 128) {
// 中文需比较两个字节
return (*left == *right) && (*(left + 1) == *(right + 1));
} else {
// 英文/符号:转换为小写后比较
return tolower((unsigned char)*left) == tolower((unsigned char)*right);
}
}

