2012-04-10 11 views
0

文字列内のすべての文字が英数字かどうかを確認しようとしています。私のコンパイラはisalnum関数を持っていません。isalnum equivalent with #define

私の関数は以下の通りで、my_structは6のサイズの文字配列(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')) 

警告:「ポインタから小さな整数に変換」

私の質問はどのように私はきちんと警告せずに、この定義を作成してください(と明らかに正確に確認してください)、です。

おかげ

+0

注意です問題を解決するために、あなたはロケールをまったく扱っていません。あなたの環境に 'ctype.h'がないのはなぜですか? – geekosaur

+0

bah、私はちょうど返事(isal .....)を言うことを意味した – NickG

答えて

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

いずれかがあなたの問題を解決する必要があります。

は、2つのオプションがあります。 bom_pn以来

+0

応答と詳細な情報をありがとう。 3人のユーザから3つの異なる解決法があるのは面白いです:) – NickG

+0

文字セットがASCIIで一般的にOKではない場合、 '*(c)= 'A' && *(c)<= 'Z'ケース(例:EBCDIC) – ouah

1

変更

lh->bom_pn[i] //character 
+0

これを修正する方法の1つ。ありがとう – NickG

+0

あなたの歓迎:) –

1

lh->bom_pn+i //pointer 

のすべての出現は、あなたのポインタを超えて対を指摘し、ことをあなたはisalphanum(*lh->bom_pn)としてそれを渡す必要があり、配列、isalphanum(*lh->bom_pn+i)など

+0

...そしてそれを修正する別の方法。ありがとう – NickG