2013-03-22 8 views
7

Sono un vero principiante di C, ma sto imparando!Personaggio strano dopo una serie di caratteri

Mi sono imbattuto in questo problema e ho deciso di chiedergli quale sia la ragione. E per favore spiega le tue risposte così posso imparare.

Ho creato un programma che consente di inserire 5 caratteri e quindi mostrare i caratteri che hai scritto e anche ripristinarli, ad esempio: "asdfg" - "gfdsa". La cosa strana è che un personaggio strano viene mostrato dopo i caratteri originali che sono stati immessi.

Ecco il codice:

char str[5]; 
char outcome[] = "OOOOO"; 
int i; 
int u; 

printf("Enter five characters\n"); 

scanf("%s", str); 

for(i = 4, u = 0; i >=0; u++, i--){ 
    outcome[i] = str[u]; 
} 

printf("\nYou wrote: %s. The outcome is: %s.", str , outcome); 


return 0; 

Se entro: "asdfg" mostra: "asdfg ♣", perché?

Grazie per il vostro tempo e vi prego di spiegare le vostre risposte :)

+2

È necessario terminare la matrice di caratteri. Vedere http://stackoverflow.com/questions/10943033/why-are-strings-in-c-usually-terminated-with-0 –

risposta

2

La stringa str[5]; è troppo breve.

Dovrebbe essere

str[6]; 

E quando lo si stampa il codice va fuori limite di tale matrice.

È inoltre necessario impostare un carattere di terminazione null sull'array str [] per contrassegnare la fine dell'array.

str[5] = '\0' 
+0

'scanf()' imposterà il terminatore per te quando si maneggia un ' specificatore di formato% s'. Detto questo, 'scanf()' in combinazione con '% s' dovrebbe essere evitato in primo luogo, poiché è un pericolo chiaro e presente per i buffer overflow. Usa invece 'fgets()'. – WhozCraig

15

Perché non esiste un terminatore nullo. In C una "stringa" è una sequenza di byte continui (caratteri) che termina con un carattere sentinella chiamato terminatore nullo ('\0'). Il tuo codice prende l'input dall'utente e riempie tutti i 5 caratteri, quindi non c'è "fine" alla tua stringa. Quindi, quando stampi la stringa, stamperà i tuoi 5 caratteri ("asdfg") e continuerà a stampare tutto ciò che è immondizia nello stack finché non raggiunge un terminatore nullo.

char str[6] = {'\0'}; //5 + 1 for '\0', initialize it to an empty string 
... 
printf("Enter five characters\n"); 
scanf("%5s", str); // limit the input to 5 characters 

La cosa bella di formato limite specificer è che, anche se l'ingresso è più lungo di 5 caratteri, saranno conservati nella vostra stringa soltanto 5, sempre lasciando spazio a quel terminatore null.