Come si consente di inserire gli spazi utilizzando scanf?

Utilizzando il seguente codice:

char *name = malloc(sizeof(char) + 256); printf("What is your name? "); scanf("%s", name); printf("Hello %s. Nice to meet you.\n", name); 

Un utente può inserire il proprio nome ma quando digitano un nome con uno spazio come Lucas Aardvark , scanf() interrompe tutto dopo Lucas . Come faccio a rendere scanf() consentire gli spazi

Le persone (e soprattutto i principianti) non dovrebbero mai usare scanf("%s") o gets() o qualsiasi altra funzione che non ha una protezione di overflow del buffer, a meno che non si sappia per certo che l’input sarà sempre di un formato specifico (e forse nemmeno allora).

Ricorda che scanf sta per “scan formatted” e c’è poco meno formattato dei dati inseriti dall’utente. È ideale se si ha il controllo totale del formato dei dati di input, ma generalmente non è adatto all’input dell’utente.

Usa fgets() (che ha una protezione di overflow del buffer) per ottenere il tuo input in una stringa e sscanf() per valutarlo. Dato che vuoi solo ciò che l’utente ha inserito senza analizzare, in questo caso non hai davvero bisogno di sscanf() :

 #include  #include  #include  /* 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; } 

Provare

 char str[11]; scanf("%10[0-9a-zA-Z ]", str); 

Spero possa aiutare.

Questo esempio utilizza un set invertito, quindi scanf continua a prendere valori fino a quando incontra un ‘\ n’ – newline, quindi anche gli spazi vengono salvati

 #include  int main (int argc, char const *argv[]) { char name[20]; scanf("%[^\n]s",name); printf("%s\n", name); return 0; } 

Puoi usare questo

 char name[20]; scanf("%20[^\n]", name); 

O questo

 void getText(char *message, char *variable, int size){ printf("\n %s: ", message); fgets(variable, sizeof(char) * size, stdin); sscanf(variable, "%[^\n]", variable); } char name[20]; getText("Your name", name, 20); 

DEMO

Non utilizzare scanf() per leggere le stringhe senza specificare una larghezza del campo. Dovresti anche controllare i valori di ritorno per gli errori:

 #include  #define NAME_MAX 80 #define NAME_MAX_S "80" int main(void) { static char name[NAME_MAX + 1]; // + 1 because of null if(scanf("%" NAME_MAX_S "[^\n]", name) != 1) { fputs("io error or premature end of line\n", stderr); return 1; } printf("Hello %s. Nice to meet you.\n", name); } 

In alternativa, usa fgets() :

 #include  #define NAME_MAX 80 int main(void) { static char name[NAME_MAX + 2]; // + 2 because of newline and null if(!fgets(name, sizeof(name), stdin)) { fputs("io error\n", stderr); return 1; } // don't print newline printf("Hello %.*s. Nice to meet you.\n", strlen(name) - 1, name); } 

Puoi usare la funzione fgets() per leggere una stringa o usare scanf("%[^\n]s",name); quindi la lettura delle stringhe termina quando si incontra un carattere di nuova riga.

getline()

Ora parte di POSIX, nessuno-meno.

Si occupa anche del problema di allocazione del buffer che hai chiesto prima, anche se devi occuparti di free la memoria.

Se qualcuno sta ancora cercando, ecco cosa ha funzionato per me: leggere una lunghezza arbitraria di stringa, inclusi gli spazi.

Grazie a molti poster sul web per condividere questa soluzione semplice ed elegante. Se funziona, il merito va a loro, ma ogni errore è mio.

 char *name; scanf ("%m[^\n]s",&name); printf ("%s\n",name); 

È ansible utilizzare scanf per questo scopo con un piccolo trucco. In realtà, dovresti consentire l’input dell’utente fino a quando l’utente non seleziona Invio ( \n ). Questo prenderà in considerazione ogni personaggio, incluso lo spazio . Ecco un esempio:

 int main() { char string[100], c; int i; printf("Enter the string: "); scanf("%s", string); i = strlen(string); // length of user input till first space do { scanf("%c", &c); string[i++] = c; // reading characters after first space (including it) } while (c != '\n'); // until user hits Enter string[i - 1] = 0; // string terminating return 0; } 

Come funziona? Quando l’utente immette i caratteri dallo standard input, saranno memorizzati nella variabile string fino al primo spazio vuoto. Dopodiché, il resto della voce rimarrà nel stream di input e attenderà il successivo scanf. Successivamente, abbiamo un ciclo for che prende char per char dal stream di input (fino a \n ) e li sospende alla fine della variabile stringa , formando così una stringa completa uguale all’input dell’utente dalla tastiera.

Spero che questo aiuti qualcuno!

Mentre davvero non dovresti usare scanf() per questo genere di cose, perché ci sono chiamate molto migliori come gets() o getline() , può essere fatto:

 #include  char* scan_line(char* buffer, int buffer_size); char* scan_line(char* buffer, int buffer_size) { char* p = buffer; int count = 0; do { char c; scanf("%c", &c); // scan a single character // break on end of line, string terminating NUL, or end of file if (c == '\r' || c == '\n' || c == 0 || c == EOF) { *p = 0; break; } *p++ = c; // add the valid character into the buffer } while (count < buffer_size - 1); // don't overrun the buffer // ensure the string is null terminated buffer[buffer_size - 1] = 0; return buffer; } #define MAX_SCAN_LENGTH 1024 int main() { char s[MAX_SCAN_LENGTH]; printf("Enter a string: "); scan_line(s, MAX_SCAN_LENGTH); printf("got: \"%s\"\n\n", s); return 0; } 

Utilizzare il seguente codice per leggere la stringa con spazi:
scanf("[%s/n]",str_ptr);