题目:输入一个字符串,判断它是否为回文串以及镜像串。
样例输入:
NOTAPALINDROME ISAPALINILAPASI 2A3MEAS ATOYOTA
样例输出:
NOTAPALINDROME -- is not a palindrome. ISAPALINILAPASI -- is a regular palindrome. 2A3MEAS -- is a mirrored string. ATOYOTA -- is a mirrored palindrome.
编程如下:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
const char* rev= "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
const char* msg[] = {"not a palindrome","a regular palindrome",
"a mirrored string","a mirrored palindrome"};
char ismirrored(char ch)
{
if(isalpha(ch))
{
return rev[ch - 'A'];
}
return rev[ch - '0' + 25];
}
int main()
{
char s[30];
int i;
int p;
int m;
int len = 0;
while( scanf("%s",s))
{
len = strlen(s);
p = 1; m = 1;
for(i = 0; i < (len+1)/2; i++)
{
if(s[i] != s[len - 1 - i])
{
p = 0;
}
if(ismirrored(s[i]) != s[len - 1 -i])
{
m = 0;
}
}
printf("%s -- is %s.\n",s,msg[m*2+p]);
}
return 0;
}
1、这个代码第一个我遇到的问题是,判断一个字符串的一半,经过测试,应该是 i < (len + 1) /2
2、答案的输出是用了一个一维数组msg,这样简化代码很有意思,希望可以运用到以后编码上。
3、这个代码用到了ctype里面的一个函数,isalpha()来判断是否是字符,同样的,还有isdigit,isprint。
如果一个字符型变量ch-‘A’,则返回的是它在字母表中的顺序,A是0,以此类推。若ch是一个数字,则ch-‘0’返回的是其数字本身,如‘5’-‘0’=5.这种使代码简化的方法要学会。
查阅资料,cytype.h:
ctype.h的C标准库的头文件中提供的声明几个有用的函数测试和字符映射。
所有的功能都接受int作为参数,其值必须是EOF或为unsigned char表示。
所有函数返回的参数c非零(true),如果满足条件。否则返回0。
库函数
以下是在头文件ctype.h中定义的函数:
S.N. | 函数及说明 |
---|---|
1 | int isalnum(int c) 该函数检查传递的字符是否是字母数字。 |
2 | int isalpha(int c) 该函数是否传递的字符是字母。 |
3 | int iscntrl(int c) 该函数是否传递的字符是控制字符。 |
4 | int isdigit(int c) 该函数是否传递的字符是十进制数字。 |
5 | int isgraph(int c) 该函数是否传递的字符的图形表示,使用的语言环境。 |
6 | int islower(int c) 该函数检查传递的字符是否是小写字母。 |
7 | int isprint(int c) 该函数检查传递的字符是否是可打印的。 |
8 | int ispunct(int c) 该函数检查传递的字符是否是标点符号。 |
9 | int isspace(int c) 该函数检查传递的字符是否是空白。 |
10 | int isupper(int c) 该函数检查传递的字符是否是大写字母。 |
11 | int isxdigit(int c) 该函数检查传递的字符是否是十六进制数字。 |
该库还包含两个转换函数,也接受并返回一个“整数”
S.N. | 函数及说明 |
---|---|
1 | int tolower(int c) 这个函数转换大写字母为小写。 |
2 | int toupper(int c) 这个函数小写字母转换为大写。 |