人々 (特に初心者) は、入力が常に特定の形式であることが確実にわかっていない限り (そしておそらくそうではない場合でも)、バッファー オーバーフロー保護を持たない やその他の関数をscanf("%s")
使用しないでください。gets()
scanf
「スキャン形式」の略であり、ユーザーが入力したデータよりも形式が少し劣っていることを覚えておいてください。入力データ形式を完全に制御できる場合は理想的ですが、一般的にユーザー入力には適していません。
入力を文字列に取得して評価するには、 fgets()
(バッファ オーバーフロー保護を備えた) を使用します。ユーザーが解析せずに入力したものだけが必要なので、この場合はとにかくsscanf()
必要ありません。sscanf()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Maximum name size + 1. */
#define MAX_NAME_SZ 256
int main(int argC, char *argV[]) {
/* Allocate memory and check if okay. */
char *name = malloc(MAX_NAME_SZ);
if (name == NULL) {
printf("No memory\n");
return 1;
}
/* Ask user for name. */
printf("What is your name? ");
/* Get the name, with size limit. */
fgets(name, MAX_NAME_SZ, stdin);
/* Remove trailing newline, if there. */
if ((strlen(name) > 0) && (name[strlen (name) - 1] == '\n'))
name[strlen (name) - 1] = '\0';
/* Say hello. */
printf("Hello %s. Nice to meet you.\n", name);
/* Free memory and exit. */
free (name);
return 0;
}