Newsgroup: it.comp.lang.c
Titolo: copiare stringhe

perche' non posso usare strncpy() passandole due stringhe appartenenti
a strutture?
Il compilatore le accetta (!!), ma in esecuzione ottengo un errore di
segmentation fault (pero', core dumped :) 
che senso ha?
hum
Ciao
rimuovere .nane per rispondere
remove.nane to reply

che senso ha?
Perchè l'istruzione è corretta, ma non lo sono atrettanto le stringhe
da copiare. Verifica che
- sia presente il terminatore di stringa sulla stringa sorgente
- la dimensione della stringa destinazione sia sufficiente per
contenere la stringa sorgente.
Entrambi gli errori danno lo stesso problema: utilizzi locazioni di
memoria che non puoi utilizzare. Ed il sistema operativo si incavola
:-)
_____________________________________________________
Francesco Trotta
http://space.tin.it/computer/ftrotta
elimina "x_" dal mio indirizzo per le risposte


ICQ #34602650

you wrote :
#Perchč presumibilmente stai commettendo un errore.
Credo che si tratti della mancanza del terminatore finale.
Dalle FAQ :
13.2
----
D:	Perche'  la  funzione  strncpy() non pone  sempre  uno  '\0'
  	terminatore nella stringa destinazione ?
R:	strncpy()   fu  studiata  inizialmente  per  manipolare  una
  	struttura  dati  ormai obsoleta, la  "stringa"  a  lunghezza
  	fissa, non necessariamente terminata da 0.
  	Un'altra  particolarita'  di  strncpy() e' quella  che  essa
  	riempie  di  zeri  le stringhe piu'  corte  della  lunghezza
  	specificata, sino a raggiungerla.
  	strncpy()  e'  inadeguata in certi contesti, per  il  motivo
  	che  bisogna  aggiungere manualmente uno '\0'  alla  stringa
  	destinazione.
  	Si  potrebbe aggirare il problema utilizzando strncat() : se
  	la stringa destinazione e' inizialmente vuota, strncat()  fa
  	esattamente cio' che farebbe strncpy().
  	Un'altra possibilita' e' sprintf(dest, "%.*s", n, source).
  	Quando  bisogna  copiare,  invece, dei  byte  arbitrari,  e'
  	meglio utilizzare memcpy().
--------------------------------------------------------
* Andrea Laforgia        (
andrea_...@bigfoot.com
) *
--------------------------------------------------------

 che senso ha?


- sia presente il terminatore di stringa sulla stringa sorgente
Opporcocane. In effetti non c'era, e anche se non ho ancora provato a
inserirlo (rispondo 'on the fly') non dubito che in tal modo il
programma funzioni. Pero', mi sfugge ancora il perche'.
Voglio dire: gli dico di copiare 80 caratteri in uno spazio di memoria
grosso.. 80 caratteri.
Che tra questi ce ne sia uno particolare oppure no, a lui che glie ne
dovrebbe fregare ?
La funzione non sarebbe stata piu intelligente se non avesse
effettuato un simile controllo?


effettuato un simile controllo?
Poni di voler copiare la stringa sorgente nella stringa destinazione.
Penso di non sbagliare supponendo che il comportamente della strcpy
sia esprimibile mediante l'unica riga di codice
for(i=0; destinazione[i]=sorgente[i]; i++);
Il ciclo viene terminato appena diventa falsa la condizione del ciclo,
non appena, quindi, viene incontrato il terminatore di stringa nella
stringa sorgente. Se questo non è presente molto probabilemente prima
o poi troverai un byte a 0. Ma prima che ciò avvenga sarai andato a
leggere (e scrivere su "destinazione") byte che non appertengono a
sorgente, modificando locazioni di memoria che non appartengono al
programma, con imprevedibili effetti collaterali.


you wrote :
#La funzione non sarebbe stata piu intelligente se non avesse
#effettuato un simile controllo?
La funzione non fa assolutamente alcun controllo sui dati contenuti.
Vuoi copiare 80 caratteri "esattamente" in 80 byte di memoria ? eccoti
accontentato, pero' ti assumi la responsabilita' della mancanza del
terminatore finale, quando la stringa verra' in qualche modo
processata.
