Люди (и особенно новички) никогда не должны использовать 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;
}