• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:isalpha()関数について)

isalpha()関数について

このQ&Aのポイント
  • isalpha()関数を使用して英字かどうか判別する方法について困っています。
  • 現在、char型配列に入力された文字列の2文字目が英字かどうかを判別して分岐させる処理を書いています。
  • しかし、isalpha()関数を使用しても思い通りの結果が得られず困っています。ソースコードとともに詳しく教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.4

No.1さんの回答通り、isalphaの引数の型はintですが、 そこには文字(char)を指定します。 文字列へのポインタ(char *)ではありません。 なぜ文字を指定するのにint型で定義されているのかは、 http://okwave.jp/qa/q4151525.htmlhttp://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'; } -------------------------- で十分なように思えます。

noname#107905
質問者

お礼

早速の回答ありがとうございました。 コメントいただいたソースをもとに、実仕様にアレンジしたところ、無事解決することができました。 また、無駄な処理もコメントにより、省くことができ、大変助かりました。

その他の回答 (3)

回答No.3

別件 >strncpy(code,,A+1,1);     //code[2]に"0"をコピー ソース通りなら、コンパイルできません。 コメント通りならソースの記述が間違ってます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

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 { で十分です。

回答No.1

# 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でしょうけど。

関連するQ&A