Newsgroup: it.comp.lang.c++
Titolo: funzione che ritorna una stringa

La seguente funzione e' corretta, oppure puo' provocare dei problemi ?
char * left (char *st, unsigned n)
 {
  char ris[81];
  unsigned i;
 
  if (n>80) n=80;
 
  if (strlen(st) <= n)
	   strcpy (ris, st);
   else
    {
     for (i=0; i<n; i++) ris[i] = st[i];
     ris[n] = 0;
    } // end else 
  return ris;  
 } // end left
Sembra tutto funzionare correttamente, pero' la stringa ris[] dovrebbe essere
deallocata quando si esce dalla funzione ... ?
Come si puo' fare per far tornare una stringa ?
Ciao
Saluti da Parma

Gastone Demalde' (
gas...@rsadvnet.it
) wrote:
: La seguente funzione e' corretta, oppure puo' provocare dei problemi ?
[ommissis]
: Sembra tutto funzionare correttamente, pero' la stringa ris[] dovrebbe essere
: deallocata quando si esce dalla funzione ... ?
In effetti dovrebbe essere un errore, poiche` la funzione restituisce
l'indirizzo ad una variabile locale che come tale viene distrutta all'uscita
dalla funzione.
: Come si puo' fare per far tornare una stringa ?
La soluzione consiste nell'allocare sullo heap l'array ris e quindi restituirne
l'indirizzo senza distruggerlo. Ovviamente sarebbe compito del chiamante
deallocare tale array.
Paolo

Se la stringa =E8 allocata dinamicamente la ritorni con un return e =
lasci
al chiamante l'onere di disallocarla (come per la funzione di libreria
strdup). Altrimenti te la fai passare come paramentro, esattamente come
fanno strcpy e tante altre str*.
Una sola curiosit=E0: la tua funzione =E8 una specie di Left$ del =
visual
basic. Quindi mi domando perch=E8 non la implementi nella maniera pi=F9
ovvia:
	/* Function: left
=09
	   Returns a string with the leftmost n characters of the
	   source string. The destination string is null terminated.
	   The destination buffer must be at least n+1 characters long.
	   Exactly n+1 bytes are written to the destination buffer
	   regardless of the length of the source string.
	   If the source string is shorter than n characters, the=20
	   destination buffer is padded with \0 untill position n.
=09
	   Parameters:
	   dest: destination string buffer
	   src:  source string
	   n:    desired length
	*/
	char* left(char* dest, const char* src, size_t n )
	{
		strncpy(dest,src,n)[n]=3D0;
		return dest;
	}
=09
---
     Andrea Ferro
SW.AN. Technologies s.a.s.
Merate (Lc)          Italy
	-----Original Message-----
	From:	
gas...@rsadvnet.it
 (Gastone Demalde')
[
SMTP:gas...@rsadvnet.it
]
	Posted At:	Friday, October 03, 1997 11:00 PM
	Posted To:	c++
	Conversation:	funzione che ritorna una stringa
	Subject:	funzione che ritorna una stringa
	La seguente funzione e' corretta, oppure puo' provocare dei
problemi ?
	char * left (char *st, unsigned n)
	 {
	  char ris[81];
	  unsigned i;
	 =20
	  if (n>80) n=3D80;
	 =20
	  if (strlen(st) <=3D n)
		   strcpy (ris, st);
	   else
	    {
	     for (i=3D0; i<n; i++) ris[i] =3D st[i];
	     ris[n] =3D 0;
	    } // end else=20
	  return ris; =20
	 } // end left
	Sembra tutto funzionare correttamente, pero' la stringa ris[]
dovrebbe essere
	deallocata quando si esce dalla funzione ... ?
	Come si puo' fare per far tornare una stringa ?
	Ciao
	Saluti da Parma

 Come si puo' fare per far tornare una stringa ?
La funzione e' sbagliata - come hai detto, ris viene deallocata all'uscita.
Puoi :
- dichiarare ris static (ma ogni volta che chiami la funzione il contenuto della
zona puntata cambia - tipo strtok)
- ritornare strdup(ris), ma poi devi ricordare di liberare la memoria
esplicitamente
- come molte funzioni C, passare alla funzione un puntatore al buffer dove
mettere il risultato, e usare quello.
- Leggere il K&R?
Saluti,
    CS
--
dr. Cristiano Sadun - Software Engineering and Consulting
***********Remove NOSPAM from address to reply***********
*********************************************************
"God is Real - unless declared Integer"