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