回文词 镜像串 ctype.h

题目:输入一个字符串,判断它是否为回文串以及镜像串。

样例输入:
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)
这个函数小写字母转换为大写。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值