使用#define等效的isalnum

时间:2012-04-10 18:38:46

标签: c casting macros alphanumeric

我正在尝试确定我的字符串中的每个字符是否都是字母数字。我的编译器没有isalnum函数。

我的函数在下面,my_struct有一个大小为6的字符数组(uint8 bom_pn [6])....是的,uint8是一个字符。

boolean myfunc( my_struct * lh )
{
ret = ( isalphanum( lh->bom_pn ) && isalphanum( lh->bom_pn + 1 ) &&
        isalphanum( lh->bom_pn + 2 ) && isalphanum( lh->bom_pn + 3 ) &&
        isalphanum( lh->bom_pn + 4 ) && isalphanum( lh->bom_pn + 5 ) );
} 

我的宏定义如下:

#define isalphanum(c) ( ( c >= '0' && c <= '9' ) ||  \
                        ( c >= 'A' && c <= 'Z' ) ||  \
                        ( c >= 'a' && c <= 'z' ) )

以上引发错误“操作数类型不兼容(”uint8 *“和”int“)”

如果我将我的定义更改为以下内容,我的代码会编译并收到警告。

#define isalphanum(c) ( ( (uint8)c >= '0' && (uint8)c <= '9' ) ||  \
                    ( (uint8)c >= 'A' && (uint8)c <= 'Z' ) ||  \
                    ( (uint8)c >= 'a' && (uint8)c <= 'z' ) )

警告:“从指针转换为较小的整数”

我的问题是,如何在没有警告的情况下正确创建此定义(并且显然可以正确检查)。

由于

3 个答案:

答案 0 :(得分:3)

正如你所说lh->bom_pn是一个字节数组,这意味着它实际上是一个指针。

因此,当您将其传递给isalphanum时,您将传递指针,并将其与文字字节进行比较。

您有两种选择:

1。)

ret = ( isalphanum( lh->bom_pn[0] ) && isalphanum( lh->bom_pn[1] ) &&
        isalphanum( lh->bom_pn[2] ) && isalphanum( lh->bom_pn[3] ) &&
        isalphanum( lh->bom_pn[4] ) && isalphanum( lh->bom_pn[5] ) );

<强> 2)。

#define isalphanum(c) ( ( *(c) >= '0' && *(c) <= '9' ) ||  \
                        ( *(c) >= 'A' && *(c) <= 'Z' ) ||  \
                        ( *(c) >= 'a' && *(c) <= 'z' ) )

任何一方都应该解决你的问题。

答案 1 :(得分:1)

更改所有出现的

lh->bom_pn+i //pointer

lh->bom_pn[i] //character

答案 2 :(得分:1)

由于bom_pn是一个数组,您需要将其作为isalphanum(*lh->bom_pn )isalphanum(*lh->bom_pn+i )等传递