Nel seguente codice, copio una stringa in un char * str, che è lungo 10 caratteri, usando strncpy()
.stringa non termina su NULL ma si comporta ancora normalmente, perché?
Ora in base al manuale strncpy()
, "Avviso: se non esiste alcun byte null tra i primi n byte di src, la stringa inserita in dest non sarà terminata null." Che è esattamente ciò che accade qui.
La stringa di origine è lunga 26 caratteri e ho copiato 10 caratteri, quindi nessun carattere nullo viene inserito alla fine di str.
Ma quando stampo il contenuto di str, a partire da 0 fino a ottenere '\ 0', si comporta normalmente.
Perché? Quando non c'è nessun '\ 0' posto alla fine, allora perché il ciclo si ferma nel punto corretto?
Quello che ho capito è che dovrebbe dare "Errore di segmentazione" o almeno non dovrebbe fermarsi lì e continuare a stampare alcuni valori di spazzatura.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
int main()
{
char *str ;
str = malloc(sizeof(char) * SIZE);
if(str == NULL)
exit(1);
memset(str, 0, sizeof(char) * SIZE);
strncpy(str, "abcdefghijklmnopqrstuvwxyz", sizeof(char) * SIZE);
unsigned int index;
for(index = 0; str[ index ] != '\0' ; index++) {
printf("str[ %u ] has got : %c \n ", index, str[ index ]);
}
return 0;
}
Ecco l'output:
str[ 0 ] has got : a str[ 1 ] has got : b str[ 2 ] has got : c str[ 3 ] has got : d str[ 4 ] has got : e str[ 5 ] has got : f str[ 6 ] has got : g str[ 7 ] has got : h str[ 8 ] has got : i str[ 9 ] has got : j
Qualsiasi aiuto sarà apprezzato.
EDIT
Esiste un modo corretto per controllare se una stringa termina a '\ 0' o no? Ho sempre pensato che il ciclo sopra descritto fosse il test finale, ma ora sembra che non lo sia.
Diciamo che otteniamo una stringa da una funzione sviluppata da un altro programmatore. Ora, come faremo a sapere che termina nella posizione corretta con '\ 0'. Può essere che non lo faccia, quindi andrà oltre la dimensione effettiva fino a quando non otterremo un po 'di' \ 0 '. Non possiamo mai sapere la dimensione effettiva della stringa.
Quindi, come possiamo affrontare questa situazione?
Qualche suggerimento?
sizeof (char) è * sempre * 1 !! – paxdiablo
@Pax: true, ma ecco una discussione su questo: http://stackoverflow.com/questions/1011806/is-it-necessario-per-multiply-by-sizeof-char-when-manipulating-memory – sharptooth
strncmp prende il numero di caratteri, non la dimensione della stringa, quindi è sbagliato utilizzarlo lì. –