- ベストアンサー
VSC2015 電卓プログラムの繰り返しに関して
- Visual studio community 2015のC++を使って電卓プログラムを作成しています。プログラムを上手く繰り返せるようにしたいのですが、エラーが発生して正常に動作しません。
- プログラムは http://saeki-ce.xsrv.jp/C_src/dentaku01.html から取得しました。初回の計算は正常に行われますが、2回目以降は無限ループしてしまい、エラーが発生します。
- エラーメッセージによると、ローカル変数'b'が初期化されていないというエラーが出ています。どのように改善すればいいでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ではこれで #include <stdio.h> #include <stdlib.h> void main() { int b=1; while( b== 1) { int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n電卓(Ver.1.0)\n"); printf("\n計算式: "); scanf_s("%s", &c, 10); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf_s("%d", &b); fflush(stdin); } }
その他の回答 (3)
- maiko0333
- ベストアンサー率19% (839/4401)
#include <stdio.h> #include <stdlib.h> void main() { int b=1; while( b== 1) { int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n電卓(Ver.1.0)\n"); printf("\n計算式: "); scanf("%s", &c); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf("%d", &b); fflush(stdin); } } こうです。
補足
何度も申し訳ないのですが、これを実行したところ エラー C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. お試し用 ~省略~ お試し用\お試し用\お試し用.cpp 14 と エラー C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. お試し用 ~省略~ お試し用\お試し用\お試し用.cpp 46 と出てしまいました。 解決方法はありますかね? 本当に何度もすみません。
- maiko0333
- ベストアンサー率19% (839/4401)
テストしました。 gets_s(c); // 計算式入力 ではなくて、 scanf_s("%s", &c); を使用しましょう。
補足
#include <stdio.h> #include <stdlib.h> void main() { int b; printf("\n電卓(Ver.1.0)\n"); int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n計算式: "); gets_s(c); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf_s("%d", &b); while (b == 1) { int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n電卓(Ver.1.0)\n"); printf("\n計算式: "); scanf_s("%d", &b); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf_s("%d", &b); } } こういうことですか? ただこれだと、2回までしかできず、答えが1回目と同じになってしまいます。もう少し教えてくださいませんか?
- maiko0333
- ベストアンサー率19% (839/4401)
>「初期化されていない まず、int b; がまずいですよね。 int b=1; でいいでしょう。 >2回目以降 これはscanf_s("%d", &b);だと思います。 数字キーを押してEnterですよね。 数字はbに入りますがEnterはどこに行くのでしょう? 実は次のgets_s(c); に入ってしまうんです。 なので、scanf_s("%d\n", &b);かfflush(stdin); をしてください。
補足
#include <stdio.h> #include <stdlib.h> void main() { int b; printf("\n電卓(Ver.1.0)\n"); int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n計算式: "); gets_s(c); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf_s("%d", &b); while (b == 1) { int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n電卓(Ver.1.0)\n"); printf("\n計算式: "); scanf_s("%d", &b); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf_s("%d", &b); } } こういうことですか? ただこれだと、2回までしかできず、答えが1回目と同じになってしまいます。もう少し教えてくださいませんか?
お礼
あっ!! 出来ました!!ありがとうございます。 これからもっと勉強してこれが簡単に書けるようにしていきたいです! ベストアンサーにさせていただきます