質問: C言語の初心者です。 Visual Studio 2015 Community を使って学習しています。 C言語の入門書を用いてサンプルプログラムを実行しています。 文字入力のサンプルプログラムを実行すると以下のようにエラーが出ます。 インターネットによると、「意図しないメモリ領域に書き込んだのだろう」ということがありましたが、見直してもよくわかりませんでした。 また、"paiza.io" にて *scanf_s* を *scanf* にすると問題なく実行できます。 何が起きておりどのように対策をすればよいかを教えてください。 本のサンプルプログラムなので投稿してよいのか迷いましたが、 短いですし、基礎的なことだと思うので投稿しました。 ``` 0x0F30D0F1 (ucrtbased.dll) で例外がスローされました (C言語の学習用.exe 内): 0xC0000005: 場所 0x00121041 への書き込み中にアクセス違反が発生しました ハンドルされない例外が 0x0F30D0F1 (ucrtbased.dll) で発生しました(C言語の学習用.exe 内): 0xC0000005: 場所 0x00121041 への書き込み中にアクセス違反が発生しました。 ``` 以下がプログラムリストです。 ``` #include "stdafx.h" int main() { int num; double dnum; char ch0, ch1, ch2; char str[81]; printf("整数を入力:"); scanf_s("%d", &num); printf("実数を入力:"); scanf_s("%lf", &dnum); printf("英字1文字と改行入力:"); scanf_s("%c%c%c", &ch0, &ch1, &ch2); printf("英文字列と改行入力:"); scanf_s("%s", str); printf("[%d]です\n", num); printf("[%f]です\n", dnum); printf("[%c][%c][%c]\n", ch0, ch1, ch2); printf("[%s]\n", str); printf("プログラムを終了するには何かキーを押してください...\n"); char x; scanf_s("%c", &x); return 0; } ``` 追記 -- 遅くなりましたが、この本の意図していることを正確にするため、本にある実行結果と説明を簡単に書きます。 ``` 整数を入力:100 実数を入力:3.14159 英字1文字と改行入力:A 英文字列と改行入力:XYZ [100]です [3.14159]です [ ][A][ ] [XYZ] ``` 本では、説明として 1 0 0 改行 3 . 1 4 1 5 9 改行 A 改行 X Y Z 改行 *____*↑P1*__________* ↑P2*_____* ↑P3 ※(追記)矢印がずれていたので直しました。 となるから状態によっては前の *scanf* で読み取った改行が次に読み込まれてしまう といった内容です。
回答: scanf_sの落とし穴 一度 str への入力でバッファサイズをつけて試してみてください。 ### 追記 とりあえずこれで動きました。 ``` #include int main() { int num; double dnum; char ch0, ch1; char str[81]; printf("整数を入力:"); scanf_s("%d", &num); printf("実数を入力:"); scanf_s("%lf", &dnum); printf("英字1文字と改行入力:"); scanf_s("%*c%c%c", &ch0, 1, &ch1, 1); printf("英文字列と改行入力:"); scanf_s("%s", str, sizeof(str)); printf("[%d]です\n", num); printf("[%f]です\n", dnum); printf("[%c][%c]\n", ch0, ch1); printf("[%s]\n", str); printf("プログラムを終了するには何かキーを押してください...\n"); char x; scanf_s("%*c%c", &x); return 0; } ```