Las personas (y especialmente los principiantes) nunca deben usar scanf("%s")
o gets()
cualquier otra función que no tenga protección de desbordamiento de búfer, a menos que sepa con certeza que la entrada siempre tendrá un formato específico (y tal vez ni siquiera entonces).
Recuerde que scanf
significa "escaneo formateado" y hay un poco menos formateado que los datos ingresados por el usuario. Es ideal si tiene un control total del formato de datos de entrada, pero generalmente no es adecuado para la entrada del usuario.
Use fgets()
(que tiene protección de desbordamiento de búfer) para obtener su entrada en una cadena y sscanf()
evaluarla. Dado que solo desea lo que el usuario ingresó sin analizar, de sscanf()
todos modos no necesita en este caso:
#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;
}