質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

3649閲覧

C言語 visual studio 2015 動作停止について

Takumi0106

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/10/22 14:04

C言語の勉強をしている学生です
visual studio2015を使って実行しているのですが、

#include <stdio.h> int main(void) { int a, b; char op; scanf_s("%d %c %d", &a, &op, &b); if (op == '+') { printf("%d", a + b); } else if (op == '-') { printf("%d", a - b); } else if (op == '*') { printf("%d", a * b); } else if (op == '/') { printf("%d", a / b); } else { } return 0; }

といった単純計算機をつくって実行したところ
数字 演算子 数字 を入力し、エンターを押したところで
動作が停止します。プログラムに問題があるのかと思いますがどこに問題があるかわかりません。
初歩的な質問ですが、教えていただけたらありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

archiver

2015/10/22 14:26

「動作が停止します」とありますが、具体的にはどのようになりますか?
Takumi0106

2015/10/23 14:41

すいません、返信おそくなりました。 デバッグなしで開始をして、数字 演算子 数字を入力してエンターを押すと 動作を停止しました。と表示されます。
guest

回答2

0

ベストアンサー

scanf と scanf_sは実は引数の仕様が違います。
違うんですが引数の指定の仕様上、間違っててもコンパイル時にエラーになりません。

scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_l

scanf および wscanf とは異なり、scanf_s および wscanf_s では、c、C、s、S の各型、
または [] で囲まれた文字列コントロール セットのすべての入力パラメーターに対して
バッファー サイズを指定する必要があります。
バッファー サイズ (文字単位) は、バッファーまたは変数のポインターの直後に
追加パラメーターとして渡されます。

つまり
scanf_s("%d %c %d", &a, &op, &b);
ではなく、
scanf_s("%d %c %d", &a, &op,1, &b);
です

投稿2015/10/22 14:26

ozwk

総合スコア13528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Takumi0106

2015/10/23 14:44

ありがとうございます。回答のとおりに訂正したところ、動きました。 引数の仕様が違うとはしらなかったです。勉強になりました。
guest

0

下記いずれかに修正すると期待通り動きますか?

c

1scanf("%d %c %d", &a, &op, &b);

c

1scanf_s("%d %c %d", &a, &op, 1, &b);

投稿2015/10/22 14:23

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Takumi0106

2015/10/23 14:48

scanf_sのほうは、その通りで修正するとうごきました。 scanfを使うと、コンパイルエラーになり、 エラー 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. と表示されます。 それがよくわからないのですが、よければ教えていただいてもよろしいでしょうか?
yohhoy

2015/10/26 04:37 編集

エラーメッセージの通り、ソースコード冒頭(#includeより前)に _CRT_SECURE_NO_WARNINGS マクロを定義すればコンパイル可能です。 scanf関数ファミリは、誤使用によるバッファオーバーランなどの脆弱性を作りこみやすく、Microsoft社の判断により"危険な"関数としてマークされています。エラーメッセージはその旨を指摘するとともに、代替案(scanf_s)を使うか自己責任(マクロ定義)でそのまま使うかをプログラマに伝えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問