标签: ,

实训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);

}

}

国开题库网客服联系方式

国开题库网客服联系方式