0

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

我的函数在下面,my_struct 有一个大小为 6 (uint8 bom_pn[6]) 的 char 数组 ....是的 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' ) )

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

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

谢谢

4

3 回答 3

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' ) )

任何一个都应该解决您的问题。

于 2012-04-10T18:41:10.217 回答
1

更改所有出现的

lh->bom_pn+i //pointer

lh->bom_pn[i] //character
于 2012-04-10T18:41:44.240 回答
1

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

于 2012-04-10T18:42:52.507 回答