编写一个检查字符是否为字母的宏

时间:2014-01-10 10:47:39

标签: c algorithm debugging macros

我正在尝试编写宏IS_ALPHABETIC,如果字符是字母字符,则会给出非零值。在其中,我指的是我定义的IS_LOWER_CASE宏以及我之前定义的uppercase宏。

这就是我所拥有的:

#include <stdio.h>

#define uppercase(n)  ((n) <= 'Z' && (n) >= ('A') ) 
#define IS_LOWER_CASE(n) ( ((n) >= 'a') && ((n) <= 'z') )

#define IS_ALPHABETIC(n) (uppercase(n) || IS_LOWER_CASE(n) ? (n) : 5)

int main()
{
    char letter = "4";
    printf("%d\n", IS_ALPHABETIC(letter));
}

因此,如果参数是字母字符,那么IS_ALPHABETIC宏应该给出值5,因为它检查它是否是小写或大写字母字符,但是无论参数如何,它每次都给出5。

例如,在我的情况下,我输入了4,因此它不应该给出值5.只有当我输入字母值时才应该这样。

uppercaseIS_LOWER_CASE宏分别检查参数是大写还是小写。

如果我正确构建了IS_ALPHABETIC宏,我不能100%确定。怎么了?

我正在尝试严格使用这些特定的宏。

2 个答案:

答案 0 :(得分:10)

变化:

char letter= "4";

为:

char letter= '4';

打开编译器警告(例如gcc -Wall ...) - 让编译器为您捕捉到这样的愚蠢错误,并为您节省大量时间和精力。

请注意,您可能希望IS_ALPHABETIC返回TRUE / FALSE(1/0)而不是n或5。

在编程风格问题上,尝试与命名,格式化,使用括号等更加一致,例如:这是代码的清理版本:

#include <stdio.h>

#define IS_UPPER_CASE(n) ((n) >= 'A' && (n) <= 'Z') 
#define IS_LOWER_CASE(n) ((n) >= 'a' && (n) <= 'z')

#define IS_ALPHABETIC(n) (IS_UPPER_CASE(n) || IS_LOWER_CASE(n))

int main()
{
    char letter = '4';
    printf("%d\n", IS_ALPHABETIC(letter));
    return 0;
}

答案 1 :(得分:0)

#include <stdio.h>

#define    IS_UPPER_CASE(n)    (((n) <= 'Z') && ((n) >= 'A')) 
#define    IS_LOWER_CASE(n)    (((n) >= 'a') && ((n) <= 'z'))

#define    IS_ALPHABETIC(n)    (IS_UPPER_CASE(n) || IS_LOWER_CASE(n) ? (n) : 5)

int main()
{
    char letter = 'a';
    printf("%d\n", IS_ALPHABETIC(letter));
}

以上是您的代码段的编辑版本,它不会一直返回5。

char letter =“4”;

当您尝试使用地址(字符串“4”而不是字符4)初始化char时,上面的初始化会生成编译器警告。

但是,对于您的输入,如果字符是字母,则可能需要打印该字符。但是要打印的是整数值,等于字符的ASCII值。 因此,您可以在printf()调用中尝试%c而不是%d。