persone (e soprattutto principianti) non devono mai usare scanf("%s")
o gets()
o alcune altre funzioni che non dispongono di una protezione buffer overflow, se non si sa per certo che l'ingresso sarà sempre di un formato specifico (e forse neppure poi).
ricordare rispetto scanf
sta per "scansione formattato" e c'è ben poco meno formattati di dati inseriti dall'utente. E 'l'ideale se si ha il controllo totale del formato dei dati in ingresso, ma in generale non idonei per l'input dell'utente.
Usa fgets()
(che ha protezione buffer overflow) per ottenere il vostro ingresso in una stringa e sscanf()
per valutarla. Dal momento che si desidera solo ciò che l'utente ha inserito, senza analisi, non si ha realmente bisogno sscanf()
in questo caso, comunque:
#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;
}
noti che più idiomatica è 'malloc (sizeof (char) * 256 + 1)', o 'malloc (256 + 1)', o meglio ancora (supponendo 'nome' sarà usato rigorosamente localmente) ' nome char [256 + 1] '. Il '+1' può agire come un mneumonico per il terminatore nullo, che deve essere incluso nell'assegnazione. –
@Barry - Sospetto 'sizeof (char) + 256' era un errore di battitura. –
Eventuali duplicati di [Lettura stringa dall'ingresso con carattere di spazio?] (Https://stackoverflow.com/questions/6282198/reading-string-from-input-with-space-character) –