【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言

isalpha()関数について

◆開発環境
OS:Linux(Ubuntu9.10)
コンパイラ:gcc4.4
IDE:eclipse
言語:C

《質問内容》
現在、char型配列A[8](最大8桁の文字列が格納されるため)に英字から始まる文字列(英字・数字)を入力し、
2文字目の文字を英字かどうか判別し、if文で分岐させようとしているのですが、
この2文字目の文字をisalpha()にかけても、英字と判別せず、思い通りの処理ができない状態で
困っています。
現状、以下のソースですと、"D0"ならelse ifに入りますが、"SM0"と入れるとifに入らずに、else ifに入ってしまいます。(2文字目は英字なのに…)

以下に、参考ソースを添付します。

どなたか、お分かりの方いらっしゃいましたら、ご教授お願いします。
できれば、isalphaの使い方等も詳しく教えていただけたら幸いです。(webで調べるとisalpha(int c)と書いてあり、文字の判別にint?とかなり疑問です。一応、ソース上ではchar型にキャストしてますが。)

《ソース》
char A[9]="";      //最大8桁の文字列(英字・数字)が入る
char B[3]="";        //A,B入れ替え用バッファ
char C[7]=""; //最大6桁の文字列(数字)が入る
char code[2]="";      //判別用バッファ
int C_val; //Cの10進値格納変数(後で使う)

fscanf(stdin,"%s",&A);

strncpy(code,,A+1,1);                  //code[2]に"0"をコピー
if( (unsigned char)isalpha(code) != 0){          //codeが英字なら先頭2文字は英字
strncpy(B,A,2);            
strncpy(C,A+2,strlen(A)-2);
C_val=atoi(C);//Cの10進化
strcpy(A,"");   //Aの初期化
strcpy(A,B);
strcpy(B,"");//Bの初期化
}

else if( (unsigned char)isalpha(code) == 0){    //codeが英字でないなら先頭1文字が英字
strncpy(B,A,1);
strncpy(C,A+1,strlen(A)-1);
C_val=atoi(C);          //Cの10進化
strcpy(A,"");//Aの初期化
strcpy(A,B);
strcpy(B,"");//Bの初期化

}

A 回答 (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';
}
--------------------------
で十分なように思えます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/03/18 12:43

別件


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

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

# warningでていないのかな?



isalphaの引数はintです。
http://www.linux.or.jp/JM/html/LDP_man-pages/man …

>isalpha(code)
では char* から int にキャストされ解釈されるのではないでしょうか?
よって
isalpha(code[0])
と指定すべきでしょう。

もっとも、codeという変数を使わずとも
isalpha(A[1])
でOKでしょうけど。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報