
C言語のscanfを勉強して、文字の読み取りをしたいな。エラーが出たけど何がダメなの?
scanf、解説します。
この記事を書いている自分は、一日中プログラミングしていた過去がありました。現在、そこで学んだC言語について解説中です。
本記事の内容
・scanfとは?
・scanfの使い方を解説
・文字列だとカンマの後に「&」を付けない理由
・C言語でscanfエラーが出たときの対処法
・C言語でSDLチェックを回避する方法
SDLチェックってなんだよ…と思ったそこのあなた!とても重要ですよこれ。
長い内容ですが、重要なので最後までご覧ください。
今回は、1から「scanf」の使い方を解説し、その後エラーが出たときの対処法を紹介します。
「scanf」はエラーが出やすいですが、この方法を使えばエラーは出ません。
scanfエラーの前に(使い方を解説)

実は、過去にscanfの紹介をしている投稿があるので基本的なことはそちらを参考にしてください。
こちらの記事では「1文字だけしか入力できないプログラム」を説明したので、今回は「数字を入力するプログラム」、「文字列を入力するプログラム」の説明をします。
「scanf」で数字を入力
「数字を入力するプログラム」は「文字を入力するプログラム」の変換書式とデータ型を変えるだけでできます。
具体的に言うとデータ型「char」を「int」に、変換書式「%c」を「%d」に変えるだけです。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int suuji;
scanf("%d", &suuji);
suuji *= 5;
printf("%d", suuji);
}
このプログラムだと入力した数字を5倍するプログラムになります。
文字列を入出力するプログラム
文字列を入出力するには以下の3つが必ず必要です。
過去の記事にて、配列の説明をしているので参考にしてみてください。
「%s」は文字列を入出力するためだけにある変換書式です。重要なので必ず覚えましょう。
下はscanfで文字列を入力し、printfで出力するときのプログラムです。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
char moji[1000];
scanf("%s", moji);
printf("%s", moji);
}
このプログラムで分かりにくいところを解説していきます。
この順番で解説していきます。
文字列だと&を付けない理由(アドレスを使うため)
文字列の場合だけカンマの後に「&」を付けません。
scanf("%s", moji);
printf("%s", moji);
見落としがちなので、もう一度見てください。scanfもprintfも&が付いていません。
実は、scanfでカンマの後に入力しているのは変数ではなく「アドレス」なのです。配列だと、アドレスは「&」と [ ] を付けないで表すため、このようなプログラムになっています。
よく、文字列にも「&」を付けたまま、「エラーが出てしまいました。」という相談を受けます。これは、「あるある」なので気を付けましょう。
変数「int a;」での代入された数値、アドレスの表し方
変数、ポインタ、配列によって「代入された数値」、「アドレス」の表し方は異なります。軽くまとめるとこんな感じです。
変数での値の表し方 | a(そのまま) |
変数でのアドレスの表し方 | &a(&付ける) |
ポインタ「int *pa」での代入された数値、アドレスの表し方
ポインタでの値の表し方 | *pa(そのまま) |
ポインタでのアドレスの表し方 | pa(*取る) |
配列「int a[配列数+1]」での代入された数値、アドレスの表し方
配列での値の表し方 | a[ ](数字取る) |
配列でのアドレスの表し方 | a([ ]も取る) |
これについてもっと詳しく知りたい方は下の記事を参考にしてください。参考プログラムを見せながら解説しています。
C言語でscanfエラーが出たときの対処法
「scanf」を使ってエラーが出てくる理由はほとんど同じです。
それは、「#define _CRT_SECURE_NO_WARNINGS」を使っていないからです。「scanf」と必ずセットで使う必要があり、「どこにそれを書くか?」も重要です。適当な位置に書いても意味がないです。必ずプログラムの1番初めに書きましょう。
また、これ以外にも原因があると思います。たとえば他にも使っているデータ型や変換書式が原因だったりします。
このサイトの最初の方を読めば「scanf」の正しい使い方が分かるので読み直しましょう。
「#define _CRT_SECURE_NO_WARNINGS」っていつ使うの?
そもそも、「#define _CRT_SECURE_NO_WARNINGS」はSDLチェックを回避するために使用するものです。SDLとは「Security Development Lifecycle」の略で、使い方によってはセキュリティ上の問題を起こすような旧式の関数の使用にエラーを出します。scanf以外にもgetsやstrcpyなどでも必要です。
【C言語scanfエラー 対処法】SDLチェックを回避する方法
- 「#define _CRT_SECURE_NO_WARNINGS」を使う
- 別の関数を使う
- プロジェクト作成→[プロパティ] → [構成プロパティ] → [C/C++] → SDL チェックを無効
SDLチェックを回避する方法はこんなにあります。(正確に言えばもっとあります)
一番上は解説しているので下の3つを解説します。
scanf以外でも文字の入力はできる
scanfを使わなくても、getchar、getsなどを使えば文字の入力ができます。
【scanfエラーの対処法】SDLチェックを無効にする
SDLチェックを無効にすることもできます。
プロジェクトを作成するときに、[プロパティ] → [構成プロパティ] → [C/C++] → SDL チェックを無効を選択すれば無効にできます。
まとめ

SDLチェックを回避する方法は3つ覚える必要は無いです。個人的には「#define _CRT_SECURE_NO_WARNINGS」が使いやすいと思うので、今後このサイトではそれを使います。
次は、乱数の発生方法を勉強しましょう。