Concatenamento di stringhe

di Anonimizzato23644 il
14 risposte
Ciao a tutti,

dovrei scrivere una funzione molto elementare ma di C ne so veramente poco. Devo fare una cosa molto semplice, una funzione che mi restituisca un char*. In pratica la funzione che sto cercando di fare è questa:

Passo un long come argomento, deve essere convertito e concatenato ad una scritta "Lt".
Per intenderci GetLtDescription(12345) deve restituirmi Lt12345. Penso che sia una cosa delle più semplici ma purtroppo non ce ne vado in fuori.

Dove sbaglio? la stringa che restituisce in questo caso scrive Lt + simboli ascii e non Lt12345

const char * GetLtDescription(long LotCode)
{
	const char* a;
 	const char* src = "Lt";

	a = (const char*)&LotCode;

	strcpy(src,"Lt");

	printf("src: %s\n",src);

	printf("a: %s\n",a);

	strcat(src, a);
	
	printf("Descr Total: %s\n",src);
	
	return src;
}

14 Risposte

  • Devi allocare la memoria non usare buffer locali
    
    #include <stdio.h>
    #include <stdlib.h>
    
    char *GetLtDescription(long LotCode)
    {
    	char *res = (char *)malloc(13 * sizeof(char));
    	
    	if(res)
    		sprintf_s(res, 13, "Lt%d", LotCode);
    	
    	return res;
    }
    
    e quando non ti serve più non dimenticare di liberarla
    
    	char *s = GetLtDescription(12345);
    	printf("%s\n", s);
    	free(s);
    
  • Un'alternativa potrebbe essere usare uno spazio "static" nel quale immagazzinare la stringa risultante. L'unico inconveniente che mi viene in mente, in questo caso, è che ad ogni chiamata alla funzione i nuovi dati vengono sovrascritti, cancellando quelli precedenti. Potrebbe essere un problema oppure no, a seconda di come si intende usare la funzione.
    const char *GetLtDescription( long LotCode ) {
        static char a[16];
        
        sprintf( a, "Lt%ld", LotCode );
        
        return a;
    }
    Facendo così non avresti bisogno di tirare in ballo l'allocazione dinamica della memoria.
  • No Aldo, non è un'alternativa
  • Motivo? (così poi lo so)
  • Prova ad usare la funzione in due punti del tuo main
  • Provo...
    #include <stdlib.h>
    #include <stdio.h>
    
    const char *GetLtDescription( long LotCode ) {
        static char a[16];
    
        sprintf( a, "Lt%ld", LotCode );
    
        return a;
    }
    
    int main() {
        printf( "%s\n", GetLtDescription(24) );
        printf( "%s\n", GetLtDescription(38) );
        printf( "%s\n", GetLtDescription(-15) );
    }
    
    /*
    in uscita ottengo, come prevedevo:
    
    Lt24
    Lt38
    Lt-15
    
    Process returned 0 (0x0)   execution time : 0.144 s
    Press any key to continue.
    */
    Scusa, ma proprio non vedo l'inghippo.
  • Quindi se nel main ho bisogno di gestire i tre valori anche dopo averli ottenuti, va bene ?
    
    	char *s1, *s2, *s3;
    
    	s1 = GetLtDescription(24);
    	s2 = GetLtDescription(38);
    	s3 = GetLtDescription(-15);
    	// ...
    	printf("%s\n", s1);
    	printf("%s\n", s2);
    	printf("%s\n", s3);
    
  • Oltre a questo l'allocazione statica nel corpo di funzione non è "thread safe".
  • Volendo però adoperare l'allocazione statica si può scrivere:
    void GetLtDescription( long LotCode, char *p )
    {
    	sprintf( p, "Lt%ld", LotCode );
    }
    
    int main()
    {
    	char a[16];
    	char b[16];
    	char c[16];
    
    	GetLtDescription(24, a);
    	GetLtDescription(38, b);
    	GetLtDescription(-15, c);
    
    	// ...
    
    	printf( "%s\n", a );
    	printf( "%s\n", b );
    	printf( "%s\n", c );
    }
  • Naturalmente ... ci sono molti modi, la questione era se usare l'allocazione statica in quel modo.
  • L'unico inconveniente che mi viene in mente, in questo caso, è che ad ogni chiamata alla funzione i nuovi dati vengono sovrascritti, cancellando quelli precedenti. Potrebbe essere un problema oppure no, a seconda di come si intende usare la funzione.
    Ora ho capito. L'avevo già scritto.
  • Unqualunque ha scritto:


    Oltre a questo l'allocazione statica nel corpo di funzione non è "thread safe".
    Al contrario, l'allocazione sullo stack e' ASSOLUTAMENTE thread-safe.
    NON E' QUESTO il problema, ma uno piu' banale!
    Quale?
  • Questo non funziona di certo...
    #include <stdio.h>
    #include <stdlib.h>
    
    const char *GetLtDescription( long LotCode ) {
        static char a[16];
    
        sprintf( a, "Lt%ld", LotCode );
    
        return a;
    }
    
    int main() {
        printf( "%s e %s\n", GetLtDescription(15), GetLtDescription(300) );
    }
  • migliorabile ha scritto:


    Unqualunque ha scritto:


    Oltre a questo l'allocazione statica nel corpo di funzione non è "thread safe".
    Al contrario, l'allocazione sullo stack e' ASSOLUTAMENTE thread-safe.
    NON E' QUESTO il problema, ma uno piu' banale!
    Quale?
    Per quanto ricordo, ma potrei sbagliarmi, le variabili globali e le variabili statiche sono allocate sul data segment o sul BBS, piuttosto che sullo stack.
    Se quella funzione con allocazione statica fosse chiamata da più di un thread, sarebbe un bel pasticcio visto che la stessa area di memoria è condivisa da tutti i thread del processo.
Devi accedere o registrarti per scrivere nel forum
14 risposte