Concatenamento di stringhe

di il
14 risposte

Concatenamento di stringhe

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

  • Re: Concatenamento di stringhe

    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);
    
  • Re: Concatenamento di stringhe

    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.
  • Re: Concatenamento di stringhe

    No Aldo, non è un'alternativa
  • Re: Concatenamento di stringhe

    Motivo? (così poi lo so)
  • Re: Concatenamento di stringhe

    Prova ad usare la funzione in due punti del tuo main
  • Re: Concatenamento di stringhe

    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.
  • Re: Concatenamento di stringhe

    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);
    
  • Re: Concatenamento di stringhe

    Oltre a questo l'allocazione statica nel corpo di funzione non è "thread safe".
  • Re: Concatenamento di stringhe

    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 );
    }
  • Re: Concatenamento di stringhe

    Naturalmente ... ci sono molti modi, la questione era se usare l'allocazione statica in quel modo.
  • Re: Concatenamento di stringhe

    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.
  • Re: Concatenamento di stringhe

    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?
  • Re: Concatenamento di stringhe

    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) );
    }
  • Re: Concatenamento di stringhe

    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