- ベストアンサー
isalpha()関数について
- isalpha()関数を使用して英字かどうか判別する方法について困っています。
- 現在、char型配列に入力された文字列の2文字目が英字かどうかを判別して分岐させる処理を書いています。
- しかし、isalpha()関数を使用しても思い通りの結果が得られず困っています。ソースコードとともに詳しく教えていただけると助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.1さんの回答通り、isalphaの引数の型はintですが、 そこには文字(char)を指定します。 文字列へのポインタ(char *)ではありません。 なぜ文字を指定するのにint型で定義されているのかは、 http://okwave.jp/qa/q4151525.html や http://okwave.jp/qa/q5326377.html を参考にしてください。 なお、提示されたソースは、かなり無駄があるように見えます。 BもCもcodeも不要で、 -------------------------- char A[9]; int C_val; fscanf(stdin,"%s",&A); if(isalpha(A[1]) == 0) { C_val=atoi(A+1); A[1]='\0'; } else { C_val=atoi(A+2); A[2]='\0'; } -------------------------- で十分なように思えます。
その他の回答 (3)
- SnowShower
- ベストアンサー率40% (140/348)
別件 >strncpy(code,,A+1,1); //code[2]に"0"をコピー ソース通りなら、コンパイルできません。 コメント通りならソースの記述が間違ってます。
- kmee
- ベストアンサー率55% (1857/3366)
isalphaは文字コードの数値で判定します。 文字列ではありません。 f( (unsigned char)isalpha(code) != 0) では、「配列codeのアドレス」を「文字コード」と思って判定しようとしますので、真になることはめったにないでしょう。 isalpha(code[0]) とするのが正解です。さらに言えば、コピーする必要すらなく isalpha(A[1]) で十分です。 あとは ・(unsigned char)とキャストする意味がありません。 ・ if( (unsigned char)isalpha(code) != 0){ でelseへ分岐したのなら else if( (unsigned char)isalpha(code) == 0) { のifの条件は必ず真ですから else { で十分です。
- bluecampus
- ベストアンサー率66% (138/209)
# warningでていないのかな? isalphaの引数はintです。 http://www.linux.or.jp/JM/html/LDP_man-pages/man3/isalpha.3.html >isalpha(code) では char* から int にキャストされ解釈されるのではないでしょうか? よって isalpha(code[0]) と指定すべきでしょう。 もっとも、codeという変数を使わずとも isalpha(A[1]) でOKでしょうけど。
お礼
早速の回答ありがとうございました。 コメントいただいたソースをもとに、実仕様にアレンジしたところ、無事解決することができました。 また、無駄な処理もコメントにより、省くことができ、大変助かりました。