#include <iostream> using namespace std; #define STR_LEN 80 //读入一行存入字符数组str,长度不超过maxLength void readline(char str[], int maxLength); //判断字符串str是否是回文 bool isPalindrome(char str[]); int main() { char str[STR_LEN + 1]; // cout << "Please input a string with length <= " << STR_LEN << ":"; readline(str, STR_LEN); if (isPalindrome(str)) { cout << "Yes" << endl; } else { cout << "No" << endl; } return 0; } //读入一行存入字符数组str,长度不超过maxLength void readline(char str[], int maxLength) { int i = 0; while (i < maxLength) { char ch = cin.get(); if (ch != '\n' && ch != '\r') { str[i] = ch; } else { break; } i++; } str[i] = '\0'; } //判断字符串str是否是回文 bool isPalindrome(char str[]) { /********* Begin *********/ int l = 0; while (str[l] != '\0') ++l; for (int i = 0; i < l; ++i) { if ('A' <= str[i] and str[i] <= 'Z')//忽略大小写 { str[i] = str[i] - 'A' + 'a'; } } int pan = 0; for (int i = 0; i < (l / 2); ++i) { cout << str[i] << ' ' << str[l - i - 1] << endl; if (str[i] != str[l - i - 1]) pan = 1; } if (pan == 0) return true; else return false; /********* End *********/ }
时间: 2024-01-31 12:02:28 浏览: 27
这是一份可以实现基本功能的代码,但是有一些需要改进的地方:
1. 代码中没有考虑字符串中包含空格和汉字的情况,需要对字符串进行处理。
2. 判断回文的过程中,输出并不是必要的,可以去掉。
3. 判断回文的过程中,可以在发现不相等的字符时直接返回 false,减少不必要的比较。
4. 判断回文的过程中,可以只比较字符串的前一半和后一半,减少比较次数。
下面是改进后的代码:
```cpp
#include <iostream>
using namespace std;
#define STR_LEN 80
//读入一行存入字符数组str,长度不超过maxLength
void readline(char str[], int maxLength);
//判断字符串str是否是回文
bool isPalindrome(char str[]);
int main() {
char str[STR_LEN + 1];
readline(str, STR_LEN);
if (isPalindrome(str)) {
cout << "Yes" << endl;
}
else {
cout << "No" << endl;
}
return 0;
}
//读入一行存入字符数组str,长度不超过maxLength
void readline(char str[], int maxLength) {
int i = 0;
while (i < maxLength) {
char ch = cin.get();
if (ch != '\n' && ch != '\r') {
str[i] = ch;
}
else {
break;
}
i++;
}
str[i] = '\0';
}
//判断字符串str是否是回文
bool isPalindrome(char str[]) {
int len = strlen(str);
char *p = str, *q = str + len - 1;
while (p < q) {
if (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n' || !isalnum(*p)) {
p++;
continue;
}
if (*q == ' ' || *q == '\t' || *q == '\r' || *q == '\n' || !isalnum(*q)) {
q--;
continue;
}
if (tolower(*p) != tolower(*q)) {
return false;
}
p++;
q--;
}
return true;
}
```
解释:
1. `isalnum()` 函数用于判断字符是否为字母或数字。
2. `tolower()` 函数用于将大写字母转换为小写字母。
3. `p` 指针指向字符串开头,`q` 指针指向字符串结尾,两个指针向中间移动,依次比较字符。
4. 在比较字符前,先判断字符是否为字母或数字,如果不是则跳过。
5. 在比较字符时,将字符转换为小写字母,方便大小写不敏感的比较。
6. 如果发现不相等的字符,则直接返回 false,不再进行比较。
7. 如果比较完字符串的前一半和后一半后都没有发现不相等的字符,则说明字符串是回文,返回 true。