0

文字列内のすべての文字が英数字かどうかを判断しようとしています。私のコンパイラにはisalnum関数がありません。

私の関数は以下のとおりで、my_structにはサイズ6のchar配列(uint8 bom_pn [6])があります....はい、uint8はcharです。

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、ポインタを渡し、リテラルバイトと比較します。

2つのオプションがあります。

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 に答える