文字列入力
名前(100バイト以内)を入力すると挨拶してくれる
name.c#include <stdio.h>
int main(void)
{
char name[101];
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()
を使うとよい:
fgets-ex.c#include <stdio.h>
int main(void)
{
int i;
char buf[16];
printf("Input:\n");
fgets(buf, 16, stdin);
for (i = 0; i < 16; i++) {
printf("%02X [%c]\n", buf[i], buf[i]);
}
return 0;
}
fgets()
を使うには,まず入力の仮保管場所(バッファ buffer と呼ばれる)を用意する。
fgets()
にはバッファの名前とサイズを指定する。最後の
stdin
は standard input(
標準入力)の意味である。