C言語のsscanf関数で変換に失敗した場合について

このQ&Aのポイント
  • C言語のsscanf関数を使用して変換に失敗した場合について質問です。
  • 入力された整数の2乗を返すプログラムで、sscanf関数が変換エラーの場合の扱いについて疑問があります。
  • 変換エラーがどのようなものか理解できず、エラーが発生すると再入力を促されることもあります。
回答を見る
  • ベストアンサー

C言語 sscanf関数で変換に失敗した場合

sscanf関数で変換に失敗した場合という点がよくわからなかったため、 質問させていただきます。 入力された整数の2乗を返すプログラム --------------------------------------------------- # include <stdio.h> # define BUFSIZE 256 int main(void) {   int input;   char linebuf[BUFSIZE];   printf("整数を入力してください。\n");   while(fgets(linebuf, BUFSIZE, stdin) != NULL) {     if(sscanf(linebuf, "%d", &input) != 0) {       printf("%dの2乗は%dです。\n", input, input*input);       break;     }     else {       printf("整数を入力してください。\n");     }   }   return 0; } ----------------------------------------------------- 例えば、入力された値が文字列であった場合、 if(sscanf(linebuf, "%d", &input) != 0) の文のところで"%d"と整数を指定しているため、 変数inputに入力された値を格納できません。 sscanf関数は変換エラーの場合は「EOF」を返すとなっているにもかかわらず、 ここでは「0」以外の場合(!= 0)となっています。 変換エラーというのは、入力された値とsscanf関数で指定した書式が異なる場合は含まないのでしょうか。 そうであるならば、変換エラーというのはどのようなものなのでしょうか。 ちなみに、「!= 0」の部分を「!= EOF」にして実行したところ、 無関係な数値が出力されました。 (aを入力したら、4198555の2乗は~と出力されました)

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.2

>変換エラーというのは、入力された値とsscanf関数で指定した書式が異なる場合は含まないのでしょうか。 含みません。 Linuxでの例になりますが http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/scanf.3.html のエラーの欄に書いてあるようなものです。

jet888
質問者

補足

回答ありがとうございます。 上記のサイトの返り値のところで、 「最初に一致の失敗があった場合には 0 になることもある。 最初の変換が成功する前に入力の最後に達して、一致の失敗が起こった場合には、 EOF が返される。」 とあります。 今回の場合は、最初に一致の失敗となるため返り値が「0」になるということだと思いますが、 「最初の変換が成功する前に入力の最後に達して」という部分との違いがよくわかりません。 入力した値はすでにlinebuf変数に格納されているため、 入力の最後に達しているということにはならないのでしょうか。

その他の回答 (11)

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.12

>> ある処理系においてはstrcmp("abcd", "abc")の戻り値は'd'になる仕様です >#4の回答には、「仕様」とは書かれていません。 #4には確かにstrcmpの仕様とは書かれていませんけど >%d以外の!=EOFの間は&inputに0が代入されると思ってました >コンパイラの仕様で戻りもかわりますね の文からすると、strcmpの戻り値として'd'を返すのも(コンパイラの)仕様と思われてるように思いますが。 また#6には >コンパイラの仕様の違いを表現する為 >関係の無いstrcmp関数を持ち出しました というような事書いてあるんですが。 >C言語では、'd'は文字ではなく、文字dの文字コード(整数値)です。したがって、int値を返す関数の中で >return 'd'; >と書いてもかまいません。もちろん整数値が返ります。 私自身が'd'を文字と思ってるわけじゃないですけど・・・

回答No.11

元の質問から離れてしまっているので心苦しいのですが、 #10の方へ > ある処理系においてはstrcmp("abcd", "abc")の戻り値は'd'になる仕様です #4の回答には、「仕様」とは書かれていません。 strcmp("abcd", "abc")は正の整数値を返せばよいので、値'd'を返してもよいということです。 > 「strcmpは何らかの演算結果で文字'd'の文字コードと同じ値を戻してるのであって、文字'd'を戻してるわけじゃない」 C言語では、'd'は文字ではなく、文字dの文字コード(整数値)です。したがって、int値を返す関数の中で return 'd'; と書いてもかまいません。もちろん整数値が返ります。

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.10

#9の方へ >'d'はint値です。 >strcmp("abcd","abc")としたとき、 > 値'd'が正であるなら、'd'を戻り値にしても規格違反ではありません。 > ('d'の値が負であるような処理系があったとして、それが-'d'を戻り値にしても規格に適っています) 私が#5で書いてるのは規格違反という話ではありません。 「ある処理系においてはstrcmp("abcd", "abc")の戻り値は'd'になる仕様です」というように「仕様」扱いにするのはおかしいという事を話をしてるんです。 もしstrcmp("abcd", "abc")の戻り値が'd'になる事、または'd'になることが予想できる事を仕様として明言している処理系がありましたら教えてください。 >> strcmpの仕様を勘違いされてます。 >> この場合、strcmpは'd'を戻してるわけじゃありません。 >この処理系は、'd'-'\0'='d'-0='d'で、'd'を戻しているのでしょう。 これは私の説明不足だったんでしょうが「strcmpは何らかの演算結果で文字'd'の文字コードと同じ値を戻してるのであって、文字'd'を戻してるわけじゃない」という事を書こうとしてました。

回答No.9

sscanfの戻り値は、『変換が一つも行われないまま入力誤りが起きたときはEOF、それ以外の場合は代入された入力項目の個数を返す、この個数はゼロになることもある。』です。 例えば、次のプログラムでは、 #include <stdio.h> int main(void) { int a, b, c, d; b = sscanf("", "%d", &a); d = sscanf("abc", "%d", &c); printf("%d %d\n", b, a); printf("%d %d\n", d, c); } bの値はEOF、dの値は0になります。aとcの値は不定です。 質問の中のプログラムでは、うまく変換できたときのsscanfの戻り値は1になるので、 if(sscanf(linebuf, "%d", &input) == 1) { とすればうまくいくでしょう。 #5の方へ 'd'はint値です。 strcmp("abcd","abc")としたとき、 値'd'が正であるなら、'd'を戻り値にしても規格違反ではありません。 ('d'の値が負であるような処理系があったとして、それが-'d'を戻り値にしても規格に適っています) > strcmpの仕様を勘違いされてます。 > この場合、strcmpは'd'を戻してるわけじゃありません。 この処理系は、'd'-'\0'='d'-0='d'で、'd'を戻しているのでしょう。

jet888
質問者

お礼

回答ありがとうございます。 遅くなって申し訳ありません。 >質問の中のプログラムでは、うまく変換できたときのsscanfの戻り値は1になるので、 >if(sscanf(linebuf, "%d", &input) == 1) { >とすればうまくいくでしょう。 確かにこの場合は、格納するアドレス変数が一つしかないため、 「==1」としたほうがいいですよね。 ご指摘ありがとうございます。

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.8

>仕様と実装の違いもよくわからないのですが、 >http://web.sfc.keio.ac.jp/~tsaito/JavaLectures/Lecture1/Lec1-1.html >によると、 そこに書かれているのは作業工程としての「実装」のような。 >例えばsscanf関数なら文字列から書式付きデータを読み込むことを目的とし、パラメータや戻り値を設定することで合ってますでしょうか。 それはsscanfの仕様の内の処理概要ですね。 VisualC++のsscanfの仕様 https://msdn.microsoft.com/ja-jp/library/ms396980(v=vs.71).aspx Linuxのsscanfの仕様 http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/scanf.3.html を見てもらえれば、それだけではなく引数や戻り値の説明も書かれているのがわかると思います。 それら全部が揃ってsscanfの仕様です。 実装は、仕様を実現するためのコード(プログラム)の事です。 実装は、仕様を実現できればよいので何種類もあることはあります。 例えば2つの整数の掛け算をするint multi(int, int)という関数があったとして実装が int multi(int a, int b) { return a * b; } であろうが int multi(int a, int b) { int r = 0; if (b > 0) { for (int i = 0; i < b; i++) { r += a; } } else if (b < 0) { for (int i = 0; i < -b; i++) { r -= a; } } return r; } であろうが、どちらもint multi(int, int)の実装には違いありません。 >私が質問のところで記述したプログラムでは<stdio.h>をincludeしていますが、 >この<stdio.h>の内容が、例えばWindowsの場合とMacの場合では異なるということでしょうか。 同じかもしれませんし異なるかもしれません(実際には異なってるんでしょうけど)。 ただヘッダファイルにはほとんどの場合、書かれてるのはプロトタイプ宣言で実装は書かれていません。

jet888
質問者

お礼

再度、回答ありがとうございます。 実装と仕様の違いと、ヘッダファイルの件についても説明していただき、 ありがとうございます。 知らないことばかりで大変勉強になりました。 何度も質問に答えていただき、ありがとうございました。

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.7

>コンパイラによって関数内部の仕様はまったく異なるのですね。 >大変勉強になりました。 違うのは仕様ではなく実装です。 関数の仕様を知りたければ実装から推測せずにマニュアルを参照しましょう。 VisualStudioのstrcmpやsscanfの仕様だと https://msdn.microsoft.com/ja-jp/library/ms396980(v=vs.71).aspx https://msdn.microsoft.com/ja-jp/library/vstudio/e0z9k731(v=vs.100).aspx になります。 その仕様を実現するために、どのような実装がされているのかを勉強するのはよいと思いますが、それを仕様と思い込まない方がよいです。 また(C)コンパイラによって異なるわけではなくライブラリによって異なります。 コンパイラはヘッダファイルなどに書かれているプロトタイプ宣言などで、関数と戻り値や引数の型を知る(事前に知ってるわけではなくコンパイル時に知ります)だけで、その関数がどのような実装になってるのかコンパイラ自身で知ってるわけじゃありません。

jet888
質問者

お礼

再度、回答ありがとうございます。 >違うのは仕様ではなく実装です。 仕様と実装の違いもよくわからないのですが、 http://web.sfc.keio.ac.jp/~tsaito/JavaLectures/Lecture1/Lec1-1.html によると、 実装とは「設計に従ってプログラミング言語で命令を記述してゆく段階です。この段階のこと」とあるので、プログラムを記述することであり、 仕様とは、「プログラムを実際に作成する際の指針と内容のあらまし」のことで、例えばsscanf関数なら文字列から書式付きデータを読み込むことを目的とし、パラメータや戻り値を設定することで合ってますでしょうか。 >その仕様を実現するために、どのような実装がされているのかを勉強するのはよいと思いますが、それを仕様と思い込まない方がよいです。 ということは、プログラムを作成する際の指針(文字列から書式付きデータを読み込むこと)は同じであるが、実装(出力の仕方など)は異なることがあるという意味でよろしいでしょうか。 >また(C)コンパイラによって異なるわけではなくライブラリによって異なります。 私が質問のところで記述したプログラムでは<stdio.h>をincludeしていますが、 この<stdio.h>の内容が、例えばWindowsの場合とMacの場合では異なるということでしょうか。

  • Wap58
  • ベストアンサー率33% (29/87)
回答No.6

1です、sscanf関数は第2引数で 要求を受けて、それを元に比較して 第1引数から第3引数に代入します 何を代入するかはコンパイラ次第 該当しないので何も代入しない もしくは0を代入するなどは コンパイラまかせです コンパイラの仕様の違いを表現する為 関係の無いstrcmp関数を持ち出しました ご指摘のようにstrcmpは文字列比較の目的で intを返します、本来の使用目的が違います 又。コンパイラによって仕様も変わります 以下のソースで内部の動きを確認して下さい #include <stdio.h> #include <string.h> int main(void){ char name[10]; int i; while(1){ printf("Type to :"); fgets(name,sizeof(name),stdin); if(strlen(name) <= 1) break; i = strcmp(name,"\0"); printf("Your Type : => %c %d\n",i,i); }//END while i = strcmp("abcd","abc"); printf("strcmp =>%c %d 100 =>%c\n",i,i,100); return 0; } 最後の部分でコンパイラの結果 Win strcmp =>『 1 100 =>d Cygwin strcmp => 1 100 =>d Mac strcmp =>d 100 100 =>d sscanf内部の仕様もコンパイラで変わります ところで日本語は自然解釈じゃダメですか?

jet888
質問者

お礼

再度、回答ありがとうございます。 >何を代入するかはコンパイラ次第 >該当しないので何も代入しない >もしくは0を代入するなどは >コンパイラまかせです この部分の意味を書いていただいたソースの実行結果を見て、 ようやく理解できました。 コンパイラによって関数内部の仕様はまったく異なるのですね。 大変勉強になりました。 ※Cygwinはまだインストールしていないため、後で実行してみます。 (Macは持ってないため実行できないのです) >ところで日本語は自然解釈じゃダメですか? これはどういう意味でしょうか?

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.5

#4の方へ >printf("strcmp=>%c\n",strcmp("abcd","abc")); (略) >うちのやつは%cにdを持って戻ってきます strcmpの仕様を勘違いされてます。 この場合、strcmpは'd'を戻してるわけじゃありません。

jet888
質問者

お礼

再度、回答ありがとうございます。 >この場合、strcmpは'd'を戻してるわけじゃありません。 この点について、#4さんの御礼コメントにも書いたのですが、 strcmp関数のデータ型はint型であるため、戻り値もint型(整数)となると思うのですが、 教えていただけますでしょうか。

  • Wap58
  • ベストアンサー率33% (29/87)
回答No.4

1です、標準関数の仕組みの勉強になりました %d以外の!=EOFの間は&inputに0が代入されると思ってました コンパイラの仕様で戻りもかわりますね できればいろんなコンパイラで試して下さい 多分以下はトピ主さんのは%cで戻らないと思います #include <stdio.h> #include <string.h> int main(void){ printf("strcmp=>%c\n",strcmp("abcd","abc")); return 0; } うちのやつは%cにdを持って戻ってきます 自作関数の発想も変わります

jet888
質問者

お礼

再度、回答ありがとうございます。 コンパイラはMinGWしか使ったことがなかったのですが、 他のコンパイラでも試したほうがいいのですね。 あと、書いていただいたコードを実行してみたところ、 strcmp=>『(かぎかっこの前の部分のみ) と出力されました。 「%c」を「%d」にしたところ、 strcmp=>1 と出力されました。 ちなみに、visual C++ 2008でためしたところ同じ結果となりました。 strcmp関数の戻り値はint型(整数)となると思うのですが、 これを%cで出力すると文字が出力されることになりますよね? >うちのやつは%cにdを持って戻ってきます これは、%cでも整数の値が出力されるということでしょうか?

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.3

>今回の場合は、最初に一致の失敗となるため返り値が「0」になるということだと思いますが、 >「最初の変換が成功する前に入力の最後に達して」という部分との違いがよくわかりません。 変換する前に文字列終端に達してる場合です。 例えばlinebufが""だったら、どうなのか考えてみてください。 >コンパイラによって挙動が異なるのですね。 >MinGWの場合、EOFではなく0でなければうまくいかないようです。 未定義の部分ですからコンパイラにより挙動が異なるのは確かですけど "a"が入力されたとき、この場合のsscanfの戻り値は0ですからEOFではもちろんありません。 またsscanfの戻り値が0ということは何も変換してないわけですからinputは int input; の何が入ってるかわからない状態です。 それがたまたま0の場合は「0の2乗は0です。」と出力されます。 #1の方の書かれてるのは『「!=EOF」で実行したところ無関係な数値0が出力されました。』という事ですよ(値が0だから関係ありそうな気がするだけで実際には何の関係もありません)。

jet888
質問者

お礼

再度、回答ありがとうございます。 >例えばlinebufが""だったら、どうなのか考えてみてください。 これは入力された文字列がなかった場合ということですね。 (enterのみが入力された場合) そう考えると、「最初の変換が成功する前に入力の最後に達して」の意味がわかりました。 また、コンパイラに関わらず、この場合のsscanf関数の戻り値は0であり、 #1さんの場合は、input変数にたまたま0が入っていたため、 「0の2乗は0です。」と出力されたということなんですね。 大変わかりやすい説明をしていただき、理解することができました。 ありがとうございました。

関連するQ&A

  • C言語 関数

    int型整数値の四乗値を返す関数int power4(int x)を作りたいのですが… int i; puts("整数を入力してください:") for (i = 0; i < 10; i++) {         printf("%d\n",i*i*i*i); } このようにすれば多分四乗になるとおもうのですが、 この場合、範囲がi<10のように指定されてしまいます。 どのようにすれば範囲に関係なく四乗の値が求められるのでしょうか? C言語初心者で、まだ基本的なものしか勉強していないのですが、 どなたかアドバイスよろしくお願いします。 (作り方は二通りあって、factorialを使う方法と上のように単純に4回かける方法があるようです)

  • C言語をお願いします

    何が違うのか教えてください。 segmentation faultになります。 よく分からないので、プログラムを作っていただければ、助かります。 問 整数を入力し、降順並び変えてに表示。 ・入力した整数は配列に入れ、その配列を使って並び変える(入力終りの印は 1000 とする)。 ・入力する整数の個数は #define NUM 100 を使いなさい。 ・使うデータは、下記の例のように、キーボードから入力すること。 #include<stdio.h> #define NUM 100 int main(void){ int d[NUM]; int temp; int i,j,n; printf("Input scores.\n"); for(i=0; i<NUM && d[i]!=1000; i++){ scanf("%d",&d[i]); } n = i; for(i = 0; i < n; i++){ for(j = i + 1; j < n;j++){ if(d[j] > d[i]){ temp = d[i]; d[j] = d[i]; d[i] = temp; } } } printf("After sort."); for(i=0; i < n; i++){ printf("%d\n",d[i]); } return 0; } 実行例 Input scores. 60 30 45 90 100 0 1000 After sort. 100 90 60 45 30 0 よろしければ 問2 並び変えをする部分を mysort 関数にしたプログラムを作ってください。 main 関数から mysort 関数には点数の個数と sort 前の配列を渡し、並び変え結果の表示はmain 関数でお願いします。 (問題の意味が分かりません) 関数はさっぱり分かりません。 では、お願い致します。

  • C言語についてです。

    mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.提出するプログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述する これについて、作ってみたのですが実行できません。 どこが間違ってるか教えてください。 #include<stdio.h> int power(int m, int n); int main() { int m,n; int a,sum; printf("整数を入力してください:"); scanf("%d",&m); printf("何乗しますか?"); sum = power(n,m); printf("%dの%d乗は%dです。\n",n,m,sum); } int power(int m, int n) { int a, kotae; kotae = 1; for(a=1; a<=n; a++) kotae = kotae * m; return kotae; }

  • C言語 %表示

    二つの整数値を読み込んで、前者が後者の何%かを表示するプログラムを作成したいです。 #include<stdio.h> int main(void){ int no1,no2; printf("整数を入力してください。\n"); printf("整数A:"); scanf("%d",&no1); printf("整数B:"); scanf("%d",&no2); printf("Aの値はBの値の%f%%です。\n",(double)(no1/no2)); } Aの値はBの値の0.0000%です。となってしまいます。 上記のプログラムの訂正をお願いします。

  • C言語について  

    わからないのでよろしくお願いします。何回やってもうまく表示できません。 整数を入力し、入力された整数の数だけ「*」を横一列に表示し、最後に改行するプログラムを while 文を使って作りなさい。 但し、0または負の値が入力された場合は、「*」は表示せず、改行のみを表示すること。 ▼10が入力された場合の実行例 ********** #include<stdio.h> int main(void) { int n, kai; scanf("%d",&n); printf("\n nyuryoku=%d",n); while(0<kai){ kai=kai--; printf("*"); } kai=n; printf("\n"); }

  • c言語について

    C言語で、二つの整数値を読み込んで、前者の値が後者の何%であるかを実数で表示するプログラムを作成しようとして以下のコードを書きました。 #include <stdio.h> int main(void) { int n1, n2 ; puts("二つの整数を入力してください。") ; printf("整数A : \n") ; scanf("%d" , &n1) ; printf("整数B : \n") ; scanf("%d" , &n2) ; printf("Aの値はBの%f%%です。\n" , (double)(n1 / n2) * 100) ; return 0 ; } 上記コードを実行すると、0.000000%のような結果になります。 そこで、最後のキャスト演算子を使用した後の式で(n1 / n2) * 100がまずいのかなと考え、n1 / n2 * 100にしたら上手くいきました。 なぜ、上記コードだと上手くいかないんでしょうか?

  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }

  • C言語

    C言語の問題が分からなくて困ってます。 時間がないのでわかる方教えていただけますでしょうか。次の1️⃣2️⃣3️⃣です。 整数割り算の結果と余りを同時に求める関数 div_mod_intを作成せよ。 ただし、ゼロ割り算は考慮しなくて良い。 * 整数割り算の結果と余りを同時に求める関数を作成 #include <stdio.h> int input_int(int *pd); void div_mod_int(int data1, int data2, ____1⃣____); int main(void) { int data1, data2; int syou, amari; while (input_int(&data1) != EOF && input_int(&data2) !=EOF) { div_mod_int(data1, data2, ____2⃣____); printf("%d / %d = %d...%d\n\n", data1, data2, syou, amari); } return 0; } /* * 整数割り算を行い商と余りを求める * 引数 int data1 :被除数 (割られる数) * int data2 : 除数 (割る数) * int data1 / data2 : 除算結果 * int data1 % data2 : 余り * 戻り値 void :なし */ void div_mod_int(int data1, int data2,____1⃣____) { ____3⃣____ __________ }

  • C言語 関数について

    協力お願いします。 2問あります。 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。

  • c言語のプログラムについて

    今年からC言語を始めた大学1年生です。レポートで四則計算を行うプログラムを6/19までに作らないといけないです。使えるのは今までに習った選択型、反復型、関数scanfです。このプログラムの留意点は次の4つです。 1.使う演算を選択してもらう   例えば   どんな演算をしますか? 1:+,2:-,3:*,4:/ (選択) 2.演算を行う数値を入力してもらう   例えば   a + b の計算をします。aを入力してください。 3.演算結果を表示する   ○+○の答えは ○です 4.計算終了か、それともほかの演算を行うか 決める   0:計算終了 1:他の計算を行う を選択してください  以下のプログラムはこのことを留意してプログラムをつくりました。どこがおかしいのでしょうか。 #include<stdio.h> main() { short a,b,m,n; long c,d,e,f; c = a + b; d = a - b; e = a * b; f = a / b; m = 1; printf("整数を入力してください:"); scanf("%d",&a); printf("どんな演算をしますか?:"); printf("1: +,2: -,3: ×,4: ÷ :"); scanf("%d",&n); while(m=1){ if(n<=4){ while(m=1){ switch (n<=4){ case 1: printf("整数を入力してください:"); scanf("%d",&b); printf("%d + %d = %d \n",a,b,c); break; case 2: printf("整数を入力してください:"); scanf("%d",&b); printf("%d - %d = %d \n",a,b,d); break; case 3: printf("整数を入力してください:"); scanf("%d",&b); printf("%d × %d = %d \n",a,b,e); break; case 4: printf("整数を入力してください:"); scanf("%d",&b); printf("%d ÷ %d = %d \n",a,b,f); break; } } } else { printf("計算できません。"); printf("演算をやり直してください。\n:"); } } printf("計算を終了しますか、それとも他の計算を行いますか?:"); printf("0:計算終了,1:他の計算を行う:"); scanf("%d",&m); printf("計算を終了します。\n"); } 提出期限があるのでなるべく早めのご回答待ってます。生意気言ってすいません。

専門家に質問してみよう