上記で話題になった記事ですけど、他のも覗いてみた。
C/C++のデータ型と書式を知る:入力の書式
#include <STDIO.H>
..........
char a[11]; /* 半角10文字分の文字列を保持する変数(配列) */
scanf( "%s", a ); /* 変数aに文字列を入力 */
printf( "%s\n", a ); /* 変数aの値を出力 */
おい! scanf って教える必要がある?教えるなら、fgets でしょう。
char buffer[11];
fgets(buffer, sizeof(buffer), stdin);
printf("%s\n", buffer);
慣れている人ならば、sscanf も加えるかもね。
char buffer1[11];
char buffer2[11];
fgets(buffer1, sizeof(buffer1), stdin);
sscanf(buffer1, "%s", buffer2);
printf("%s\n", buffer2);
なぜ scanf を使わないか?というと buffer overflow する可能性があるから。元記事の sample 11文字以上の入力があった場合には、buffer overflow します。
これ見て C 覚えようとしている人どうなるんだろ?Bug の発生だけでなく脆弱性にもなるんですけど。
初心者にわかりやすく解説したいというのはわかります。でも、脆弱性が絡む部分は後から教えるではダメだと思う。脆弱性が発生する原理は後追いで解説するのはかまわないとしても、脆弱性を生む要因を教える時に脆弱性を回避する方法を一緒に教えないと。もしくは脆弱性が発生しない方法のみ教える。
どうしても scanf を使って簡単に説明したいというなら、書式指定文字で size を制限する。
char buffer[11];
scanf("%10s", buffer);
printf("%s\n", buffer);
次の page に書式指定文字の解説が書いてあるんですが、説明ないですねぇ。