c语言怎么判断回文数列
回文是指一个字符串正读和反读都一样的字符串,在C语言中,我们可以通过比较字符串的首尾字符来判断一个字符串是否为回文,如果首尾字符相等,那么我们可以将首尾字符去掉,继续判断剩下的字符串是否为回文,如果首尾字符不相等,那么这个字符串就不是回文,这个过程可以通过循环来实现。
(图片来源网络,侵删)
下面是一个C语言实现判断回文的程序:
#include <stdio.h> #include <string.h> int is_palindrome(char *str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { if (str[i] != str[len 1 i]) { return 0; } } return 1; } int main() { char str[100]; printf("请输入一个字符串:"); scanf("%s", str); if (is_palindrome(str)) { printf("这是一个回文字符串。 "); } else { printf("这不是一个回文字符串。 "); } return 0; }
程序首先定义了一个is_palindrome
函数,用于判断一个字符串是否为回文,在这个函数中,我们首先获取字符串的长度,然后通过一个循环来比较字符串的首尾字符,如果首尾字符不相等,那么返回0表示这个字符串不是回文,如果循环结束后都没有发现不相等的首尾字符,那么返回1表示这个字符串是回文。
在main
函数中,我们首先定义了一个长度为100的字符数组str
,用于存储用户输入的字符串,然后通过scanf
函数获取用户输入的字符串,并将其存储到str
数组中,接下来,我们调用is_palindrome
函数来判断用户输入的字符串是否为回文,如果是回文,那么输出“这是一个回文字符串。”;如果不是回文,那么输出“这不是一个回文字符串。”。
需要注意的是,这个程序只能判断单个单词的回文,如果要判断整个句子的回文,还需要对空格进行处理,对于句子“上海自来水来自海上”,我们需要将其转换为“上海自来水来自海上”才能正确判断其是否为回文,这可以通过将输入的字符串中的空格去掉来实现,下面是修改后的代码:
#include <stdio.h> #include <string.h> #include <ctype.h> int is_palindrome(char *str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { if (str[i] != str[len 1 i]) { return 0; } } return 1; } int main() { char str[100]; printf("请输入一个字符串:"); scanf("%s", str); int len = strlen(str); for (int i = 0; i < len; i++) { if (isspace(str[i])) { // 如果遇到空格,跳过后面的字符 memmove(&str[i], &str[i + 1], len i); // 将后面的字符向前移动一位,覆盖掉空格和后面的字符 len; // 更新字符串长度 i; // 更新循环变量i,以便重新检查当前位置的字符是否为空格 } else if (isalpha(str[i])) { // 如果遇到字母,跳过后面的非字母字符(包括空格) while (!isalpha(str[i + 1])) { // 向后查找下一个字母字符的位置 memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非字母字符向前移动一位,覆盖掉后面的非字母字符和空格 len; // 更新字符串长度 } memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非字母字符向前移动一位,覆盖掉后面的非字母字符和空格 len; // 更新字符串长度 } else if (ispunct(str[i])) { // 如果遇到标点符号,跳过后面的非标点符号字符(包括空格) while (!ispunct(str[i + 1])) { // 向后查找下一个标点符号字符的位置 memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非标点符号字符向前移动一位,覆盖掉后面的非标点符号字符和空格 len; // 更新字符串长度 } memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非标点符号字符向前移动一位,覆盖掉后面的非标点符号字符和空格 len; // 更新字符串长度 } else if (isdigit(str[i])) { // 如果遇到数字,跳过后面的非数字字符(包括空格) while (!isdigit(str[i + 1])) { // 向后查找下一个数字字符的位置 memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非数字字符向前移动一位,覆盖掉后面的非数字字符和空格 len; // 更新字符串长度 } memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的非数字字符向前移动一位,覆盖掉后面的非数字字符和空格 len; // 更新字符串长度 } else { // 如果遇到其他字符,跳过它和后面的所有字符(包括空格) while (isprint(str[i + 1])) { // 向后查找下一个可打印字符的位置(即跳过所有不可打印字符) memmove(&str[i + 1], &str[i + 2], len i 1); // 将后面的不可打印字符向前移动一位,覆盖掉后面的不可打印字符和空格 len; // 更新字符串长度 } } } if (is_palindrome(str)) { // 如果处理后的字符串长度大于0且为回文,输出结果并释放内存空间(因为处理后的字符串可能与原始字符串不同) printf("这是一个回文字符串。 "); free(str); // 释放内存空间(如果需要的话) } else { // 如果处理后的字符串长度不大于0或不为回文,输出结果并释放内存空间(因为处理后的字符串可能与原始字符串不同)