人们(尤其是初学者)不应该使用scanf(“%s”)或gets()或任何其他没有缓冲区溢出保护的函数,除非你确定输入总是一个特定的格式甚至不是)。
记住,scanf代表“扫描格式化”,并且珍贵的格式比用户输入的数据少。如果您对输入数据格式具有完全控制权,但通常不适合用户输入,则这是最理想的选择。
使用fgets()(它有缓冲区溢出保护)来获取你的输入一个字符串和sscanf()来评估它。因为你只想要用户输入而不解析,你不需要真正需要sscanf()在这种情况下:
#include
#include
#include
/* 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;
}