文字入力について
fgets関数
標準入力からの文字入力といえばscanf関数ですが、セキュリティの問題上、scanfではなくfgetsを利用することをすすめます。
#include <stdio.h> //必要であれば追記
#include <string.h>
char name[21];
printf("名前を入力して下さい\t");
fgets(name, sizeof(name), stdin);
//改行コードを終端コードに置き換える
name[strlen(name) - 1] = '\0';
printf("\nあなたの名前は %s です。\n", name);
注意点
- 改行コード(\n)に会うと、改行コードに続いてヌル文字を追加する仕様になっている → キーボードからの入力では改行コードが含まれるため削除する(ヌル文字に置き換える)必要がある
- 入力は文字列として受け取る → 文字列から数値へ変換する必要がある
なぜscanfを使ってはいけないか?
- 配列のサイズを超えた入力の抑制ができない
- 改行以外に、スペースも区切り文字になってしまう
- gets関数も同様の問題を持つ
fflush関数
scanf()では、最後の改行文字がバッファの中に残って、想定しないような動作になるときがあります。そこで、おまじないとしてfflush関数を一つ入れることをオススメします。
関連リンク
- 文字列はNULL終端させる――C/C++セキュアコーディング入門(3) (Codezine)
- scanfは使うな (工学ナビの中の人のBLOG)