PDA

View Full Version : [C] Problema stupido con sprintf


magix2003
10-11-2007, 17:34
Ciao a tutti,
ho un problema molto stupido che riguarda l'utilizzo dei puntatori a stringa. Con l'uso di sprintf voglio inserire un integer ad un puntatore char *t vuoto. Al termine di questa operazione so che dovrei inserire il carattere '\0' ma non so come fare...

char *insertpid(){
printf("risultato getpid %d",getpid());
sprintf(temp, "%d", getpid());
*temp = '\0';
printf("dentro insert pid: %s", temp);
return temp;
}


Chi mi può aiutare?
Grazie a tutti

magix2003
10-11-2007, 17:44
Ok, ho trovato una soluzione, non so se è esattamente corretta ma funziona:

char *insertpid(){
char *temp;
sprintf(temp, "%d", getpid());
temp[strlen(temp)] = '\0';
return temp;
}

71104
10-11-2007, 18:01
non serve che tu inserisca manualmente il terminatore, la sprintf già lo fa. questa riga di codice è inutile:
temp[strlen(temp)] = '\0'; perché strlen si basa proprio sul conteggio manuale dei caratteri che termina quando viene incontrato il terminatore. se il terminatore non ci fosse già quella riga non funzionerebbe perché la strlen andrebbe a cercare arbitrariamente oltre la fine del buffer.

magix2003
10-11-2007, 18:05
Be allora non riesco a spiegarmi perchè ora funzioni e prima no. Prima se provavo a stamparla a video mi dava dei caratteri speciali, ora stampa correttamente...

71104
10-11-2007, 18:24
Be allora non riesco a spiegarmi perchè ora funzioni e prima no. Prima se provavo a stamparla a video mi dava dei caratteri speciali, ora stampa correttamente...
ma che c'entra, il programma di prima era completamente diverso: metteva il terminatore come primo carattere della stringa, quindi la stringa risultava sempre vuota. comunque vorrei farti notare che è errata anche la seconda versione: non hai allocato il buffer.

magix2003
10-11-2007, 18:38
Hai ragione, la funzione era completamente errata. Quella (spero) corretta è:

char *insertpid(){
char *temp = malloc(10);
sprintf(temp, "%d", (int) getpid());
return temp;
}

Presumendo che un pid non sia mai più lungo di 9 caratteri...

Comunque continuo a non capire come mai la versione errata dava lo stesso un risultato corretto... Bah...

71104
10-11-2007, 18:45
perché andavi a scrivere chissà dove in memoria; la variabile temp era un dangling pointer.