|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
[C/C++] strncpy: perchè mettere il fine stringa?
Come da titolo, nella lettura di un file, estraggo dalla riga del file la sequenza di caratteri con strncpy.. questa funzione a quanto pare NON include il carattere teminatore... leggo che sarebbe indispensabile metterlo.
Perchè? Ho scritto del codice che non ne fa uso e sembra andare bene.
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. |
|
|
|
|
|
#2 | |
|
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
Quote:
Comunque strncpy aggiunge il terminatore se la lunghezza della sorgente è minore della lunghezza richiesta. ciao! |
|
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Jul 2011
Messaggi: 246
|
Quote:
__________________
Non c'è cosa peggiore nella vita di un programmatore di un errore che si presenta solo ogni tanto. CONCLUSO POSITIVAMENTE CON: oldfield |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5748
|
Ci avevo pensato, ma volevo averne la certezza. In ogni caso ancora non mi spiego perchè senza funziona.. Nel caso indicato da british penso che ci sia una inclusione naturale perchè il terminatore dovrebbe essere quello della riga del file.
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti. |
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
Quote:
Codice:
while( *p++ ) {}
Altra roba è il fine riga; la riga è un concetto più "umano" ("logico"). La fine della riga è determinata da uno o più caratteri particolari ("\n","\r","\r\n" a seconda del sistema operativo) e non c'entra un piffero col fine stringa: una stringa può contenere più righe. Per es. questo è un array di char di dimensione 21, che contiene una stringa di lunghezza 13, terminata dal byte '\0' (valore = 0) In questa stringa possiamo poi riconoscere tre righe, separate dal terminatore di riga '\n' ( valore = 10 ). I restanti 7 byte "kjegfkf" sono "spazzatura", nel senso che non sono considerati. Potrebbero essere roba a caso, potrebbero essere tutti zero. O potrebbero essere un'altra stringa (ma è un'altra storia... vedi per es. il funzionamento di strtok) "ciao\na\ntutti\n\0kjegfkf" ciao! |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 2515
|
Qui, te ne danno anche l'implementazione, così ti puoi fare un'idea più precisa
http://linux.die.net/man/3/strncpy |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
Prova a compilare mettendo le ottimizzazioni al massimo.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
a me basta una ragione per spiegare il byte di terminazione: "buffer overflow vulnerability"
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
Se abbiamo A = "pippo\0" e B di 10 elementi e usiamo strncpy specificando 10 come lunghezza, allora strncpy si fermerà perchè c'è il terminatore, altrimenti cercherà di copiare 10 elementi da A ( che è minore di 10 ). Se invece specifichiamo 4 come lunghezza, allora sia che c'è il terminatore, sia che non c'è, comunque strncpy si ferma a 4 ( molto prima della fine della stringa reale ). |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:44.




















