我正在尝试确定我的字符串中的每个字符是否都是字母数字。我的编译器没有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' ) )
警告:“从指针转换为较小的整数”
我的问题是,如何在没有警告的情况下正确创建此定义(并且显然可以正确检查)。
由于
答案 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 )
等传递