• ベストアンサー

標準ライブラリ関数と標準入力を使ったプログラミング

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の使い方がいまいちよく分かってないのともしかしたら根本的に何か大きく違ってるのかもしれないのですが何か助言等あれば頂きたいので宜しくお願いいたします。

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

  • ベストアンサー
  • peko_pee
  • ベストアンサー率53% (45/84)
回答No.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進)以下のコードには特殊機能が 割り当てられているので、その部分は避けて表示するようにしてみるのも 一考かと思います。

ueda_no_tatchan
質問者

お礼

実用的なアドバイスありがとうございました! 確かに今考えている実行をするためにはisdigitでは無理です; 参考にさせていただきます!

その他の回答 (2)

  • kaha
  • ベストアンサー率23% (41/177)
回答No.2

> 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と表示させたいのですよね?上手く動作しませんか?

ueda_no_tatchan
質問者

お礼

アドバイスありがとうございました! isdigitについてはだいたい理解できました。(*^^*) ただisdigitだと考えている動作がうまく実行できないかもしれないということが分かったので別の方法もやってみたいと思います。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 おっしゃるとおり、isdigitの使い方が間違っております。 とりあえず http://www.linux.or.jp/JM/html/LDP_man-pages/man3/isalpha.3.html をご覧ください。 引数に渡すべきなのは「unsigned char 」になります。 ヒント scanfの中身の%dが誤りになります。 蛇足 scanfは危険に過ぎる関数なので、原則「何があろうとも絶対に使わない」ことを強くお勧めいたします。特にそれが業務系であるのなら。 # 学校でのお勉強ではよく用いられているようなのですが。…苦言は山のようにだせますが。

ueda_no_tatchan
質問者

お礼

アドバイスありがとうございました! いろいろ参考にさせていただきました。(_ _) ゼミの課題でこのプログラムを作成したのですがやはりscanfはできるだけ使わないほうがいいということでした…(^^;) 勉強になりました。

関連するQ&A

  • C言語 コンパイルできるが実行するとエラー

    非負の数字を入力してもらい表示させ、数字以外を入力した場合は終了するプログラムです↓(VC使用) ━━━━━━━━━━━━━━━━━━━━━━━━━━ #include "stdafx.h" #include <stdio.h> #include <stdlib.h> /* atoi使用 */ #include <ctype.h> /* isdigit使用 */ int main(void) {   char cx;   int nx;   printf("非負の整数を入力してください。:");   scanf("%s", cx);   if(isdigit(cx) == 0){     printf("数字を入れてください。\n");   }else{     nx = atoi((const char*) cx);   }   printf("%d", nx);   return 0; } ━━━━━━━━━━━━━━━━━━━━━━━━━━ 実行し文字を入力するとDebug Error!と小窓がでます。どこがおかしいのでしょうか?

  • 文字の数値化 関数化

    文字を入力されたとき、数値入力を促す関数を作りたいのですが、 最初の文字が文字ならエラーメッセージがちゃんと出るのですが、 最初の文字が数字ならエラーメッセージが出てくれません。 アドバイスお願いいたします。 tew2 ← エラー出る 2test ← エラー出ない #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> float ss_input(void); int main(){ int i; int pop; printf("何人の入力しますか(3人以内)->"); do{ pop=ss_input(); if(pop >3) printf("3人以内でお願いします\n"); }while(pop<1 || pop>3); return 0; } float ss_input(void){ char p[100]; float st; int i=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("数値を入力してください->"); scanf("%s",p); continue; } else{ break; } } st=atof(p); return st; }

  • C言語のプログラムみてください(isdigit)

    質問は2つあります。 (1) scanf関数を使って、 時給: と表示されたところに一文字打ち込み、数字以外ならばもう一度 時給: と表示されるプログラムを作りたいです。 以下のプログラムなら、 isdigit関数は数字を渡せば0以外の数を返す(真)から、 while文の条件式(偽)のようにすれば、 ・数字を一文字うちこめばwhile文の条件式にあてはまらない、すなわち下のプログラムではisdigit(payment) != 0 となり、return 0; が実行され、プログラムが終わる ・数字以外を一文字打ち込めばwhile文の条件式が真となり、printf関数とscanf関数が実行されて入力待ち状態になる と思ったのですが、どうやら違うようです。実際には ・数字一文字打てばまた入力待ちになる ・数字以外を一文字打てば永遠にprintf関数とscanf関数が実行される のはなぜでしょうか。 #include <stdio.h> #include <ctype.h> int main(void){ int payment; do{ printf("時給[円]:"); scanf("%d",&payment); } while (isdigit(payment) ==0) ; return 0; } (2) 実際には、一文字の制限なく、数字以外の何かを入力したら、再び入力待ちになるプログラムを作りたいのですが、これはどうしたらいいのでしょうか。 つまり 時給: のところに数字以外ならまた 時給: となるようにしたいのです。お願いします。

  • ASCIIコード入力

    プログラムを作っていてどうしてもわからなくなりまして… #include <stdio.h> int main(void) { char c; c=38; printf("%c\n",c); return 0; } この場合は&が出てくるからいいんですけど… #include <stdio.h> int main(void) { char c; scanf("%c",&c); printf("%c\n",c); return 0; } この場合は97をscanすると9が出てきます。ASCIIコード入力でaを表示させたいんですが、何が間違っているのでしょうか? 初心者なもので…お願いしますm(__)m

  • C言語プログラミング

    台形の面積を求めるプログラムを作りたいのですが、最後のmensekiの出力の仕方がわかりません。printf以降のプログラムを教えてください。 #include<stdio.h> #include<conio.h> void main() { int number1,number2,number3,menseki; printf("上底を入力してください:"); scanf("%d",&number1); printf("下底を入力してください:"); scanf("%d",&number2); printf("高さを入力してください:"); scanf("%d",&number3); menseki=(number1+number2)*number3/2; printf( ここがわかりません getch(); }

  • 詳しい方に質問です

    Cを始めて2日目の初心者です。 #include <stdio.h> int main () { int a,b; printf("一つ目の数字を入力"); scanf("%d", &a); printf("二つ目の数字を入力"); scanf("%d" &b); printf("%d - %d = %d\n"a,b,a-b); } このプログラムの間違っているところを教えてください。

  • プログラミングについて教えてほしいんですが・・・

    プログラミングについて教えてほしいんですが・・・ プログラミングで四則演算プログラムをやっているのですが余りの求め方がわかりません。足し算の求め方は /*lesson2.c*/ #include<stdio.h> int add(int,int); int main(){ int a,b,c; printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); c=add(a,b); printf("a+b=%d\n",c); } int add(int x, int y){ return x+y; } というやり方で求めることができたのですが、余りは上のプログラムのどこを変えたらいいのでしょうか? 誰かわかる人がいたら教えてください。お願いします。

  • プログラムがうまく動作しない

    int型変数aとbにそれぞれ値を入力し、それらをかけた結果を出力するプログラムをつくりました。もし文字が入力されたら yarinaoshi と表示し再びaに値を入力するように指示します。しかしこのプログラムはデバグしても何のエラーもないのですが、実際に実行し文字を入力すると Microsoft C++ Debug Library というダイアログボックスが出てきて Abort, Retry, Ignore の三つのボタンがでてきます。どれを選んでも作業は止まってしまい、思ったような結果が得られません。一体どうすればいいのでしょうか?  以下がそのプログラムのソースコードです。 #include <stdio.h> #include <ctype.h> #include <stdlib.h> int kakezan(int a, int b); int main(void) { int dt= 1; int a, b; while(dt !=0){ printf("Int1:"); scanf("%d", &a); if(isalpha(a) != 0) { printf("yarinaoshi"); scanf("%d", &a); } printf("Int2:"); scanf("%d", &b); dt = kakezan(a, b); printf("Result:%d\n", dt); } return 0; } int kakezan(int a, int b) { int dt; return dt = a*b; }

  • プログラミング 関数について教えて下さい。

    プログラミングについての質問です。 関数を使った以下のプログラムを作成し、実行してみたのですが、上手くいきません。 どこかおかしいのでしょうか? 教えていただけると幸いです。ご回答お待ちしております。 #include <stdio.h> double add (double x,double y); int main(void) { double a,b,c; printf("double型の数を入力して下さい。\n"); scanf("%f\n",&a); printf("もうひとつdouble型の数を入力してください\n"); scanf("%f\n",&b); c=add(a,b); printf("入力された2数の和は%fです。\n",c); return 0; } double add(double x,double y) { double z; z=x+y; return z; }

  • C言語 プログラミング

    C言語、プログラミングの質問です。 構造体について、 プログラムを組んでみたのですが、上手く出力されません。実行時にはエラーはないのですが、出力時に上手くいきません。どなたかどこがおかしいかわかる方、教えていただけませんでしょうか? #include <stdio.h> struct user{ char *name; char *id; int books; }; int main (void) { struct user u; printf("氏名を入力して下さい。"); scanf("%s",u.name); printf("パスワードを入力してください。"); scanf("%s",u.id); printf("年齢を入力してください。"); scanf("%d",&u.age); printf("氏名 %s\n",u.name); printf("パスワード %s\n",u.id); printf("年齢 %d\n",u.age); return 0; } よろしくお願いします。