• ベストアンサー

整数と文字を同時に扱う

数字を入力して,正ならplusを負ならminusを、 0ならzeroを表示し、ピリオド「.」が入力されたとき プログラムを終了するプログラムを作らなければならないのですが、 整数と文字を同時に扱うのって可能ですか?? 一応、 #include<stdio.h> int main(void){ int a; while (a!='.'){ printf("変数aに数字を入力してください\n"); printf("a="); scanf("%d",&a); if(a>0){ printf("%d is plus\n",a); }else if(a==0){ printf("%d is zero\n",a); }else{ printf("%d is minus\n",a); } } return(0); } で作ったのですが、数字以外を入力すると無限ループします。

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

  • ベストアンサー
noname#50176
noname#50176
回答No.3

正確にいくなら以下を参考にしてみて下さい。 #include<stdio.h> #include<stdlib.h> #define END '.' // 終了コード int main(void){ int a,c,k; char i[10]={1}; while (i[0]){ printf("変数aに数字を入力してください\n"); printf("a="); scanf("%10s",i); for (k=0,c=0;i[k];k++) { if (k) {if (!(i[k]>='0' && i[k]<='9')) {c=1;break;}} else if (!(i[0]>='0' && i[0]<='9' || i[0]=='+' || i[0]=='-')) {c=1;break;} } a=atoi(i); if (!(i[0]-END) && !i[1]) { i[0]=0; continue; } else if (c) { printf("有効な数字ではありません\r\r\n"); continue; } if(a>0){ printf("%d is plus\n",a); }else if(a==0){ printf("%d is zero\n",a); }else{ printf("%d is minus\n",a); }} return (0); }

ionwide
質問者

お礼

皆さん> ご回答ありがとうございます。 おかげで解決しました。 これをC言語を習って4週目でやれってのも厳しいですよねw

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

あえて、このまま行くなら、while ループの判定で int 型と char 型を比較しているので、まずこれを止めて while (1) { .. } と無限ループにします。 scanf() の戻り値は代入が成功した要素の数なので、 数値以外がキーボードから入力されると 0 が戻ってくる。その場合に再度 char 型でバッファを scanf してピリオドと比較、一致すればbreak。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

入力が数値かどうかわからない場合は、文字列として受け取るべきだと思います。 受け取った文字列を解析して、数値として読めるかどうか判断するような関数を作れば良いのでしょう。 IsNumeric()という関数がありますが、たしかC言語ではなかったような。 IsNumeric()関数がなければ、真似をして作ってみればいかが?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • この課題を解いてください

    大学で C言語の入門の授業を取っています。 受講生はC言語をやるのは初めてのようです。 私は何年か前からやっていたので楽勝の授業なんですが、 3週目にして、以下の課題を与えられました。 キーボードから数値を入力して、それが正なら「plus」を、負なら「minus」 を、ゼロなら「zero」を表示するプログラムを作成せよ。ただしピリオド「.」が入力されたら終了とする。 で、私は、 #include<stdio.h> #include <stdlib.h> int main(void){ char s[1]; int a; while (1){ printf("変数aに数字を入力してください\n"); printf("a="); scanf("%s",&s[0]); a=atoi(s); if(s[0]=='.')break; if(a>0){ printf("%d is plus\n",a); }else if(a==0){ printf("%d is zero\n",a); }else{ printf("%d is minus\n",a); } } return(0); } のように作りました。 私は授業ではまだ習っていない配列や、atoiという関数を使いましたが、 他の履修生にとっては難しい課題じゃないですか? それとももっとシンプルに作れますか?

  • 間違いが理解できない!!

    下に投稿を行ったばかりですが 質問させてください。 #include<stdio.h> int main(void) { int a; a=3 if(a==a/2*2){ printf("%d is EVEN \n",a); }else{ printf("%d is ODD \n",a); }return(0);} 課題文 「上記のプログラムを改造して、 aが正の場合はPLUSを、 aが負の場合はMINUSを、 aがゼロの場合はZEROを 表示するプログラムを作成し、 実行しよう。」 とあったので、私は #include<stdio.h> int main(void){ int a; printf("変数aに数字を入力してください\n"); printf("a="); scanf("%d",&a); if(a>0){ printf("%d is plus\n",a); }else if(a==0){ printf("%d is zero\n",a); }else{ printf("%d is minus\n",a); } return(0); } と作成しました。 しかし、評価はFAIRでした。(PASS,FAIR,RETRYがあり、 FAIRは「課題を取り違えているがOK.ただし満点じゃない」です) なぜかと言うと、習っていないscanfを使ったかららしく、 課題と違うからだそうです。 習っていないものを使ってはいけないなど聞いてもいませんし、 (私はC言語の知識がある程度あったのでscanfを使いました) 納得いきません。 もし、課題文が、 「上記のプログラムの if文以下を改造して・・・」 となっていたら、私のプログラムは間違いです。 しかし、改造してとしか書いてなかったので、 間違いではないと思います。 皆さんはどうおもいますか?

  • if~else文の中にまたif~else文をいれるには。

     このプログラムを思うように実行したいのですが、できません。 コンパイルはできるのですが、警告が4つほど出て、結果も自分が思ってるのとは違います。 プログラムのどこを改善すべきか教えてください。 OSはWindows XPで、コンパイラはボーランドのフリーコンパイラを使用しています。 #include<stdio.h> int main(){ int a,b,c,d; printf("1か0を入力してください。\n"); scanf("%d",&a); if(a=0) { printf("2か3を入力してください。\n"); scanf("%d",&b); if(b=2){ printf("今まで合計は%dです。\n",a+b); } if(b=3){ printf("今まで合計は%dです。\n",a+b); } else { printf("指定した数字を入力して下さい。\n"); } } else if(a=1) { printf("あなたは%dを入力しました。\n",a); } else { printf("指定した数字を入力してください。\n"); } return 0; }

  • 素数判定の繰返し

    繰返し素数判定を行ない、CtrlーDで終了するプログラムをつくっています。 まず繰返しなしの素数判定プログラムを作り #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } return(0); } これはちゃんとできたのですがそれを繰り返すことができません。 #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); while((a=getchar())!=EOF){ if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } printf("自然数を入力:"); scanf("%d",&a); } printf("プログラムを終了します。\n"); return(0); } これは訳わからないことになっちゃいます。。。 どうしたらいいんでしょうか??

  • 解説お願いします。

    0から9までの数字を入力しあたりかはずれかを表示するプログラム。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void){ int r,a; printf("0から9までの数字を入力してください。\n"); scanf("%d",&a); srandom(time(NULL)); r = random()%10; printf("%d \n",r); if(a==r){ printf("アタリ\n");} else{ printf("ハズレ\n");} return 0; } 例えば%10は何のためにあるのかとか・・

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • 長方形、円、三角形の計算するプログラムでエラーがでます

    タイトルの通りなんですがエラーがでます>< コンパイラはできたのですが、実行して二つ目の入力するとこで、入力したあと止まります。 どこがおかしいのでしょうか? #include <stdio.h> int sikaku(void); int en(void); int main(void) { char ch; int a,b; printf("円(A) 長方形(B) 三角形(C)\n"); printf("入力してください:"); ch = getche(); if(ch == 'C'){ printf("\n底辺を入力してください:"); scanf("%d ",a); printf("高さを入力してください:\n"); scanf("%d",b); printf("%dです",a * b); } else if(ch == 'B') sikaku(); else if(ch == 'A') en(); return 0; } int en(void) { int a; float f; printf("\n半径を入力してください:"); scanf("%d",a); printf("円周率を入力してください:"); scanf("%f",f); printf("%fです",a * a * f); return 0; } int sikaku(void) { int a,b; printf("\n縦を入力してください:"); scanf("%d",a); printf("横を入力してくさい:\n"); scanf("%d",b); printf("dです",a * b); return 0; }

  • 入力された2つの整数の差を絶対値を出力するプログラム

    2整数の差を絶対値を出力するプログラムをつくりました. 入力される数値は、正数の場合は最大8桁まで有効とし、9桁目以降を無視、負数の場合は '-'を含め、最大9桁まで有効とし,10桁目以降を無視するようにしたい。 2番目の数値入力で9桁以降に数字以外の文字を入力すると,うまく動きません.なぜ動かないかとどのように直したらよいか教えてください. お願いします. #include <stdio.h> #include <stdlib.h> #define BUFFERSIZE 10 #define PLUS_MAX 8 #define MINUS_MAX 9 #define C_NULL ('\0') #define RC_OK 0 #define RC_ND -1 #define RC_ID -2 #define RC_MD -3 int absolute( int n1, int n2 ) ; main() { char n[ 2 ][ BUFFERSIZE ]; int i ; int a[ 2 ] ; int ab ; int count ; int n_pos ; char c ; for( i = 0 ; i < 2 ; i ++ ){ printf( "%d番目の数値 :", i + 1 ) ; for( count = 0 ; count <= BUFFERSIZE ; count ++ ){ c = getchar() ; if( c >= '0' && c <= '9' || count == 0 && c == '-' ){ n[i][ count ] = c ; continue ; } if( c == '\n' ) break ; printf( "Error!\n" ) ; return( RC_ID ) ; } if( count == 0 ){ printf("Error!\n"); return( RC_ND ); } else if( n[ i ][ 0 ] == '-' && count < 2 ){ printf("Error!\n"); return( RC_ID ) ; } if( n[ i ][ 0 ] == '-' && count > MINUS_MAX ){ n_pos = MINUS_MAX ; }else{ if( count > PLUS_MAX ){ n_pos = PLUS_MAX ; }else{ n_pos = count ; } } n[ i ][ n_pos ] = '\0' ; a[ i ] = atoi( n[ i ] ) ; } ab = absolute( a[ 0 ], a[ 1 ] ) ; printf( "絶対値は %d \n", ab ) ; return( RC_OK ); } int absolute(int n1, int n2) { int i ; i = n1 - n2 ; return i >= 0 ? i : -i ; }

  • scanfに文字が入力されたときにエラー表示させる

    こんばんは.C言語勉強中です. 以下にsizeofを用いて各データタイプのサイズを表示させるプログラムを作りました.プログラム全文は下に貼付けました.これは,1-7までのいずれかの数字を入力すると,それに対応したサイズが表示されます.1-7以外の数字が入力されると,Type 1 - 7, please,と表示され,再び数字を入力出来ます.このプログラムは数字を入力している間はうまく機能していると思います. ただ,文字を入力すると無限ループに陥ってしまいます.僕は以下の scanf("%d",&typed); で10進数で読み込んで, if(typed<1 || typed >7) とすれば,文字も含めて全ての入力に対して排除できるかと思ったのですが,これではダメなようです. こういう場合,どうやって文字の入力に対するエラーを表示させるのが一般的なのでしょうか? 素人質問ですみません.よろしくお願いします. #include <stdio.h> #include <stdint.h> #include <Windows.h> int8_t main() { int typed; while(1) { while(1) { printf("Type the data type you wanna know the size of\n"); printf("char 1, short 2, int 3, long 4, long long 5, float 6, double 7: "); scanf("%d",&typed); printf("What you typed is %d\n",typed); if(typed<1 || typed >7) { printf("Type 1 - 7, please\n"); Sleep(1000); continue; } else { break; } } printf("Data size is "); switch(typed){ case 1: printf("%d\n",sizeof(char)); break; case 2: printf("%d\n",sizeof(short)); break; case 3: printf("%d\n",sizeof(int)); break; case 4: printf("%d\n",sizeof(long int)); break; case 5: printf("%d\n",sizeof(long long)); break; case 6: printf("%d\n",sizeof(float)); break; case 7: printf("%d\n",sizeof(double)); break; default: printf("Unexpected Value!\n"); break; } Sleep(2000); } return(0); }

  • C言語で 数字を配列に入力し,q Qで終了させたい

    O.reillyのC実践プログラミング第3版で、勉強しています。 p105の 実習7-6 「いくつかの数字が入力されたとき、正の数がいくつあるか、負の数がいくつあるかを  数えるプログラムを作成せよ」に取り組んでみました。    例えば 「1 -1 2 -2 3 -3 -4 -5 で8つの数があり、正が3 負が5を出力させたい」のです。  入力の終わりは、q,Qで、終了させたいと考えました。  でも、「8個の数字を配列に入力させq、Qで入力終了」のところがうまくいきません。  次のようなプログラムで行き詰まっています。  どこを手直しすればいいのか教えて下さい。 #include <stdio.h> #include <math.h> #define KOSU 10 /*入力できる個数*/ char line[10];/*入力した数を受けるためのバッファ*/ int plus_count = 0;/*プラスカウンター*/ int minus_count = 0;/*マイナスカウンター*/ int number[20]; int given_number; int i; int main(void) { printf("+、ーの数を 入れなさい。(最大20まで)\n 終わるときは、qを入れる\n"); { for(i = 0; i < KOSU; i++) { fgets(line, sizeof(line), stdin); sscanf(line, "%d", &given_number); number[i] = given_number; /*ここからした、qを入れるとそこで終了のはずがうまく動きません 10個入れたらちゃんと終わるのですが。*/ if ( (given_number == 'q') || (given_number == 'Q') ) break; } } for(i = 0;i < KOSU;i++) { printf("number[%d] = %d \n", i, number[i]); } /*正負の数を数えることにする。*/ for(i = 0;i < KOSU;i++) { if(number[i] > 0) plus_count++; else minus_count++; } printf("plus is %d\n",plus_count); printf("minus or zero is %d\n",minus_count); }

このQ&Aのポイント
  • 罫線の細線でA4レポートを表示している際に、太線がランダムに印字される問題が発生しています。
  • 使用している製品はブラザーのDCP-J926Nです。
  • お使いの環境はWindows10で、無線LANで接続されています。ひかり回線を使用しています。
回答を見る

専門家に質問してみよう