- ベストアンサー
標準ライブラリ関数と標準入力を使ったプログラミング
C言語で「入力された数字をASCIIコードとして文字で出力する」というプログラムを作っています。 isdigitを使って入力が数字だったら値を出力して、それ以外のときはエラーメッセージが出力されるようにしたいのですが上手く動作しません。 以下が作ったプログラムなのですが。 #include<stdio.h> #include<ctype.h> int main(void) { int=a; scanf("%d",&a); if(isdigit(a))printf("%c",a); else printf("エラーです"); return 0; } isdigitの使い方がいまいちよく分かってないのともしかしたら根本的に何か大きく違ってるのかもしれないのですが何か助言等あれば頂きたいので宜しくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、変数 a の宣言にある '=' は不要です。空白またはタブで区切って int a; でOKです。この部分の文法チェックではじかれてしまうかもしれません。 scanf で %d と指定し10進整数の入力を期待しているので、数値以外の 文字が入力された場合は入力が無視され、a の値は変更されません。 なので、数値かそうでないかを区別する場合はあらかじめ a に特別な数値を 入れておいて、 int a=-1; scanf("%d",&a); if(a == -1) printf("エラーです"); else printf("%c",a); とするといいと思います。 isdigit()は引数に指定した1文字の文字コードが数字を表すコードかどうかを 調べるものなので、引数に指定するのは「1文字分の文字コード」です。 isdigit(a)とすると a が数値かどうかではなく、数字を表す文字コード ('-'や'.'も含まれます)かどうかを調べていることになります(もしそれが 目的ならこの書き方で正解ということになりますが)。 余談ですが、scanfで型が合わずに無視された入力文字は次の入力時に (型が合えば)使われます(たしかそうなるはずです)。 もうひとつ余談ですが、ASCIIでは31(10進)以下のコードには特殊機能が 割り当てられているので、その部分は避けて表示するようにしてみるのも 一考かと思います。
その他の回答 (2)
- kaha
- ベストアンサー率23% (41/177)
> isdigitの使い方がいまいちよく分かってない 【形式】 #include <ctype.h> int isdigit(int c); 【調査する文字c】 0~UCHAR_MAX(255)またはEOF(-1) 【戻り値】 cが数字の文字'0'~'9'(48~57)なら!0(0以外)を返し、数字以外の文字なら0を返す。 たとえば、49[Enter]と入力して、1と表示させたいのですよね?上手く動作しませんか?
お礼
アドバイスありがとうございました! isdigitについてはだいたい理解できました。(*^^*) ただisdigitだと考えている動作がうまく実行できないかもしれないということが分かったので別の方法もやってみたいと思います。
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 おっしゃるとおり、isdigitの使い方が間違っております。 とりあえず http://www.linux.or.jp/JM/html/LDP_man-pages/man3/isalpha.3.html をご覧ください。 引数に渡すべきなのは「unsigned char 」になります。 ヒント scanfの中身の%dが誤りになります。 蛇足 scanfは危険に過ぎる関数なので、原則「何があろうとも絶対に使わない」ことを強くお勧めいたします。特にそれが業務系であるのなら。 # 学校でのお勉強ではよく用いられているようなのですが。…苦言は山のようにだせますが。
お礼
アドバイスありがとうございました! いろいろ参考にさせていただきました。(_ _) ゼミの課題でこのプログラムを作成したのですがやはりscanfはできるだけ使わないほうがいいということでした…(^^;) 勉強になりました。
お礼
実用的なアドバイスありがとうございました! 確かに今考えている実行をするためにはisdigitでは無理です; 参考にさせていただきます!