文字列入力
名前(100バイト以内)を入力すると挨拶してくれる
code:name.c
int main(void)
{
printf("Your name? ");
scanf("%100s", name);
printf("Hello, %s!\n", name);
return 0;
}
単に scanf("%s", name) とすることが多いと思うが,これでは何文字でも入力できてしまい,確保した領域からはみだして,他の領域を壊す可能性がある(セキュリティ上のリスク)。必ず上限を scanf("%100s", name) のように指定する。 入力を保存する場所(上の例では name)は,「文字列終わり」を表す「0」のバイトを含めるため,入力バイト数の上限より一つ長くしておく。
ただし,これでは例えば Haruhiko Okumura と入力したとき Haruhiko までしか入らない。"%s" は「スペースを含まない文字列」を一つ入力するという意味だからである。改行 \n の直前まで全部入力する(ただし上限100バイト)には scanf("%100[^\n]", name); とする。ここで [...] は文字の集合を表し,[^...] は補集合を表す。したがって [^\n] は改行以外という意味になる。
改行も含めて1行をそのまま入力するには fgets() を使うとよい:
code:fgets-ex.c
int main(void)
{
int i;
printf("Input:\n");
fgets(buf, 16, stdin);
for (i = 0; i < 16; i++) {
printf("%02X %c\n", bufi, bufi); }
return 0;
}
fgets() を使うには,まず入力の仮保管場所(バッファ buffer と呼ばれる)を用意する。fgets() にはバッファの名前とサイズを指定する。最後の stdin は standard input(標準入力)の意味である。