Newsgroup: it.comp.lang.c
Titolo: sprintf e char * non dimensionato

Salve a tutti,
    non riesco a capire perche' la printf usata cosi' non funziona:
http://paste.phpfi.com/52243
devo forse allocare spazio al puntatore?
grazie 1000
Dade


e si lo devi allocare la tua funzione dovrebbe essere cosi':
#define BUF_SIZE 100
char *prova(const char *testo){
      char *txt="Ciao a tutti";
      char buf[BUF_SIZE];
      sprintf(buf, "%s%s",txt,testo);
      return buf;
}
e per essere sicuro di non sfondare buf dovresti usare snprintf con n = 
BUF_SIZE
Ciao,
Cesare

Dade wrote:

Perche il codice nella funzione prova() è sbagliato:
char *txt = "stringa";
crea un puntatore ad una stringa immodificabile formata da 
strlen("stringa") + 1 caratteri.
la sprintf() cerca di copiare il contenuto di txt e della stringa 
parametro nella stessa txt!!!
ROBA DA MATTI!!!

 ha scritto nel messaggio
news:386cppF...@individual.net...

Scusami per la stronz@ta che ho detto, ma continuo a non capire: char * txt
non e' un puntatore a una stringa costante, dovrei poterlo modificare....
sbaglio?
grazie 1000
Dade

Dade wrote:

Vedi quello che ha scritto Cesare che capisci

 sbaglio?
modificare forse, allungare no...
g.


Grazie Cesare,
cosi' facendo pero' mi da questo warning:
cosi [Warning] function returns address of local variable
e scrive roba incomprensibile....
ho provato leggendo questo post:
http://groups.google.it/groups?q=funzione+ritorna+char+*&hl=it&lr=&group=it.comp.lang.c&selm=bav8hi%243uu5j%241%40ID-190851.news.dfncis.de&rnum=3
a modificare cosi':
char *prova(const char *testo){
     char *txt;
     txt = (char *)malloc(100 * sizeof(char));
     sprintf(txt,"%s%s",txt,testo);
     return txt;
}
ma ci sono sempre dei caratteri incomprensibili all'inizio della stringa
Grazie 1000
Dade

 return buf;
Argh.
Max

 cosi [Warning] function returns address of local variable
scrivi: static char buf[BUF_SIZE];
al posto di: char buf[BUF_SIZE];
e funziona.
ciao.


Mi sono dimenticato static.
Chiedo perdono.
Si Dade devi usare static.
static vuole dire che il buffer di cento char vivra' anche dopo che 
sarai uscito funzione 'prova'.
Ti sconsiglio malloc se puoi sapere a priori quanto deve essere lunga la 
stringa. In questo caso usa sempre 'snprintf'.
Ciao,
Cesare


Perche' usi sempre lo stesso indirizzo in memoria nella stessa sprintf 
su una memoria non inizializzata.
sprintf(txt,"%s%s",txt,testo);
          ^          ^
          qui   e    qui
La versione *debuggata* della funzione e':
#define BUF_SIZE 100
char *prova(const char *testo){
       char *txt="Ciao a tutti";
       static char buf[BUF_SIZE];
       sprintf(buf, "%s%s",txt,testo); /* nota buf != txt */
       return buf;
}
Ti sconsiglio di usare la malloc perche' poi il chiamante di 'prova' si 
deve *ricordare* di fare la free della memoria allocata.
Usa malloc solo se non sai quanto deve essere lunga la stringa.
Ciao,
Cesare

 devo forse allocare spazio al puntatore?	
Il codice corretto è il seguente (non compilato):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *prova(const char *testo);
int main(void){
    char *mybuf;
    printf("%s", (mybuf = prova("da Denis")));
    if (mybuf) free(mybuf);
    system("PAUSE");
    return 0;
}
char *prova(const char *testo){
     char *txt="Ciao a tutti";
     char *buf = malloc(strlen(txt)+strlen(testo)+1);
     sprintf(buf,"%s%s",txt,testo);
     return buf;
}
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it