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

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

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

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

Q&A

解決済

4回答

1654閲覧

C言語入門者です。scanfについて

dsajkldf

総合スコア5

C

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

0グッド

0クリップ

投稿2021/08/16 20:47

C言語の事で聞きたいのですが、Visual Studio 2019を使っていて、

#include<stdio.h>
int main(void) {

char suuji, moji;
printf("1つの数字とアルファベット一文字を入力してください。\n");
scanf("%d", &suuji);
rewind(stdin);
scanf("%c", &moji);
printf("数値は%dで、文字は%cです。\n", suuji, moji);

return 0;
}

と打つと「Run-Time Check Failure #2 - Stack around the variable 'suuji' was corrupted.」とエラーが出ており、

変数をintに変えるとエラーが出ないです。

なぜ、charはエラーが出るのでしょうか?

また、型 SEHException の例外が発生しました。これは拡張機能が原因である可能性があります。[ログ ファイルを開く]とも出ています。

初歩的なものですが、お教えしていただくと嬉しいです。

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

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

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

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

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

thkana

2021/08/16 22:12

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13247803923 https://teratail.com/help#posted-otherservice 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」 とあります。対応してください。 こう指摘すると、容易に削除できる知恵袋側の投稿を削除して済ます人もいますが、すでにあちらにも回答がついています。質問を削除することは、回答者に対して失礼に当たる行為になるかと思いますので削除で済まされないほうがよろしいかと思います。
dsajkldf

2021/08/16 22:32

ありがとうございます。気を付けます。
thkana

2021/08/17 15:30

気を付けます、じゃなくて直ちにマルチポストを行ったときの処置を実行してください。なにかそれができない/やらない理由でもあるのでしょうか? 知恵袋は解決にすると追記できませんけれど...少なくともできることはやってください。
guest

回答4

0

char suuji, moji;

printf("1つの数字とアルファベット一文字を入力してください。\n");

を入力したいなら scanf("%c", &suuji);

を入力したいなら int suuchi; scanf("%d", &suuchi);

投稿2021/08/16 22:11

episteme

総合スコア16612

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

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

thkana

2021/08/16 22:36

質問者は「数字」と「数値」をちゃんと区別できているでしょうか...?
dsajkldf

2021/08/16 22:47

いえ区別はできていないです…。
guest

0

ベストアンサー

一言で原因を語るなら、「scanf関数の書式設定誤りによる、スタック破壊(スタックオーバーフロー)」です。

scanf("%d", &suuji);で何が起きるかを考えます。
まず、scanf関数が、標準入力から、int型の整数値(として読み込める文字列)を読み取ります。そして読み取った整数を、第2引数で指定される領域に格納しようとします。

問題はここで、scanf関数に渡したのはchar型の領域(1バイト)で、int型(環境依存だが、32bit環境なら概ね4バイト)の変数を格納するためのスペースには足りない、ということです。スペースが足りなくても、scanf関数は指定された領域に整数を書き込みます。

その結果、周りのメモリ領域が破壊されます。標準されたメッセージは、周囲のメモリ領域が破壊されていますよ、というメッセージなのです。

最近のコンパイラは優秀なので、このような誤りはコンパイル時に警告してくれます(設定による)。しかし、一度実行を開始してしまうと、scanf関数の中からは、領域の大きさを検出することができないため、実行を止めることはできません。そのため、我々設計者の注意力で、事前に問題を回避する必要があるのです。

投稿2021/08/16 21:53

majiponi

総合スコア1722

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

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

dsajkldf

2021/08/16 23:03

回答ありがとうございます。 少し理解できた気がします。 %dはint型(4バイト)だから、それを無理やり、char型(1バイト)のところに、はめようとして、容量がパンクしたためエラーが出たというわけですね。 分かりやすい回答ありがとうございます。
guest

0

"%d"はint型の変数として指示された領域にデータを取り込む変換指定です。
"%d"に対応するところにint型以外のポインタを与えた時、何が起こるかは保証されていません。それで何が起こるか把握していないなら「やってはいけない」と思っていればいいです。

それと、例外が発生するようだとC++として扱っていないかという疑いも出てきます。C++はCから派生した言語ではありますが、すでに「枝分かれ」があるので別の言語であることは十分に意識してかかる必要があるでしょう。もしC言語をいじるつもりでいてソースコードの拡張子をデフォルトのまま.cppとしているなら、.cに変更するべきかと思います。(拡張機能云々というとVisualStudio側の機能の問題で違うのかもしれませんが)

投稿2021/08/16 21:51

thkana

総合スコア7703

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

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

dsajkldf

2021/08/16 23:04

回答ありがとうございます。 拡張子がcppになっていました。 アドバイスありがとうございます。
guest

0

scanf("%d", &suuji); // %dだから

投稿2021/08/16 21:35

ozwk

総合スコア13553

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

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

dsajkldf

2021/08/16 23:05

回答ありがとうございます。 int型だからエラーが発生したというわけですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問