#目次
0.はじめに
1.scanfとscanf_s
2.%cを扱う時の注意点
3.for文などでiを使用するときの注意点
4.if文などの条件式
5.最後に
#はじめに
この記事はC言語を習い始めて一年ほどの初心者の私が、初めてすぐのころにミスをしていたことについてまとめたものになります。
記事を書くのも初めてですので、誤字・脱字等があるかもそれませんがご了承ください。
#scanfとscanf_s
まず最初にVisualStudioでプログラミングを行うとき、scanfの下にscanf_sというのが出てきます。ほとんどの学習参考書やネット記事などは、scanfで表記されているためそのままscanfを記述することになると思います、しかし下のコードのように書いたときほとんどの場合で__C4996__というエラーが発生します。
#include<stdio.h>
int main()
{
char c[10];
scanf("%s", c);
printf("%s", c);
}
このエラーが出る理由としては、初心者がscanfを使用するとバッファオーバーランを起こしてしまう可能性が非常に高いからとされています。
またこのエラーを解消しscanfを使用したい場合は、scanf_s
をscanfの代わりとして使用することや、#include<stdio.h>
の前に#define _CRT_SECURE_NO_WARNINGS
や#pragma warning(disable : 4996)
を記述することでscanfのまま使用することもできます。
※バッファオーバーランとは元々,コンピュータのメモリ上の領域(バッファ)よりも大きなデータが渡されているのにプログラムがそれを見逃して領域あふれ(オーバーラン)が起きてしまうことを指す。
#%cを扱うときの注意点
scanfの使用時に注意することは前述のことだけではありません。
scanfで一文字ずつ入力するときに使用する%cにも気を付けなければいけないことがあります。例えば下のようなコードは入力はできても、出力で10文字中5文字分しか表示されません。
for(int i=0;i<10;i++)
{
scanf("%c", &c[i]);
}
なぜ10文字とも表示することができないのかというと、そもそも__%c__というのは一文字づつ入力を行うというものなので、スペース区切りで入力した場合も改行区切りで入力した場合でもそれ自体を一文字と認識してしまうため、見た目では5文字でも10文字分の領域を使っているからです。
これらを解消するにはscanf("%c", &c[i]);
の前にダミーとしてscanf("%c", &dummy);
を用意しておくことや、空白類文字の読み捨てを行うように%cの前に空白を入れscanf(" %c", &c[i]);
というように記述することで正常に入出力を行えます。
#for文などでiを使用するときの注意点
for文などを使用するとき基本的にはint型の変数iを使う人が多いと思います。しかし使用する場所によってはエラーの種になる可能性を秘めています。例えば下のようなコードの場合エラーとなります。
int main()
{
int n[10];
for (int i = 0; i < 10; i++)
{
scanf("%n", &n[i]);
}
for (i = 0; i < 10; i++)
{
printf("%d", n[i]);
}
}
これがエラーになる理由としては、一つ目のfor文の中でiを宣言しているので、そのiをfor文の外に持ち出して使用することは基本的に不可能であるためです。for文などの関数はそれ自体で一つの領域のようなものなので、その領域内で定義したものは領域外では定義されていないため存在しないため、もし使用したい場合はfor文などの領域外で定義しておくことでその内側であればどこでも使用できるようになります。
#if文などの条件式
条件式というのはif文などを使用するときに基本的に必要になるものです。ただこれを使用するときのミスは、プログラミングを始めてすぐのころはほとんどの人がするはずです。例えば下のように、よく見たらちょっとしたケアレスミスをしていたり。
if (n = 10)
{
printf("%d", n);
}
else if(n=<9)
{
printf("low");
}
else
{
printf("high");
}
本来等価演算子は==
と二つ記述しなければいけないのに一つしかなかったり、比較演算子で<=
と記述しないといけないところが逆になっているなど、条件式を扱う際は、しっかり見直せばわかるミスが起こりやすいので注意して使用しましょう。
#最後に
今回は初心者の陥りがちなミスをまとめていきましたが、私もいまだに気を抜いてこれらのミスをしていることがあるので、今後も気を抜かずしっかりとプログラミングを行っていきたいと思います。
ここまでご清覧ありがとうございました。