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