Convertire un intero in una stringa in C

di il
7 risposte

Convertire un intero in una stringa in C

Hola a tutti
voglio implementare una funzione che mi converta un intero (int) in una stringa (char *) utilizzando il linguaggio C, ma senza utilizzare librerie esterne. Non riesco a trovare un punto di partenza qualcuno saprebbe darmi solo l'input iniziale?

7 Risposte

  • Re: Convertire un intero in una stringa in C

    Ciao, inizia magari stampando a video le singole cifre, con un ciclo che prende il valore % 10 e poi lo divide per 10 per la passata successiva
  • Re: Convertire un intero in una stringa in C

    Grazie ma è quello a cui avevo pensato anche io inizialmente e l'ho anche fatto
    
    char *intAstringa(int n){
    	char* ret = NULL;
    	int num_chars = 0;
    
    	// È NEGATIVO?
    	int negativo = 0;
    	if (n < 0) {
    		n = -n;
    		negativo = 1;
    		num_chars++;
    	}
    
    	// ORDINE
    	int temp = n;
    	do {
    		num_chars++;
    		temp /= 10;
    	} while ( temp );
    
    	//IMPOSTA FINE DELLA STRINGA\0
    	ret = (char*)malloc(sizeof(char)*(num_chars+1));
    	ret[num_chars] = '\0';
    
    	//AGGIUNGE SEGNO MENO SE NEGATIVO
    	if (negativo) ret[0] = '-';
    
    	// INSERISCE LE CIFRE IN ORDINE INVERSO
    	int i = num_chars - 1;
    	do {
    		ret[i--] = n%10 + '0';
    		n /= 10;
    	} while (n);
    
    	return ret;
    }
    
    Il problema è che utilizzo la funzione malloc(). C'è modo "pulito" di evitarla?
  • Re: Convertire un intero in una stringa in C

    Secondo me la funzione dovrebbe restituire la stringa NON come valore di ritorno, ma caricando un buffer che gli viene passato; questo sarebbe più semplice per l'utilizzatore che a questo punto non deve preoccuparsi di richiamare poi un free() sul puntatore che gli ritorni (e deciderà lui cosa passarti, se vuole o meno allocare dinamicamente).
    Se vogliamo rendere ancora più semplice per l'utilizzatore, la funzione potrebbe ritornare il puntatore alla stringa che è stata passata, in modo da permettergli di inserire la chiamata all'interno di altre chiamate.

    prototipo
    char *intAStringa( int n, char *str, int maxstr )
    es.
    char locstr[80];
    printf( "Il valore è %s\n", intAStringa( 10, locstr, 80 ) );
    

    Infine, solitamente non "scomodo" mai una malloc() per piccoli buffer, preferisco definire una stringa locale (es. char tmp[80]).
    Non so se questo si possa definire più "pulito" di quello che hai fatto tu, di certo semplifica di molto la gestione degli errori (la malloc() potrebbe fallire).
    Se devi convertire un intero puoi conoscere a priori quale sarà la lunghezza massima della stringa che dovrai trattare e quindi potresti effettivamente dimensionare opportunamente la stringa locale. Poi la stringa locale la copi nella stringa passata (attenzione al maxstr) oppure lavori direttamente sulla stringa passata...
    Spero di esserti stato d'aiuto e di averti dato qualche spunto
  • Re: Convertire un intero in una stringa in C

    Ho capito candaluar! Appena riesco la modifico grazie
  • Re: Convertire un intero in una stringa in C

    candaluar ha scritto:


    ...la malloc() potrebbe fallire ...
    Se una malloc fallisce, direi che hai ben altri e mostruosamente piu' gravi problemi da risolvere

    Per la conversione, perche' non ragionare anche in termini:

    1) in che base lo voglio rappresentare? 10, 16, 8, 2, -10 (esistono anche le basi negative )
    2) e in forma romana?
    3) e convertito in parole (millenovecentonovantanove)?

    Forte, no?
  • Re: Convertire un intero in una stringa in C

    migliorabile ha scritto:


    1) in che base lo voglio rappresentare? 10, 16, 8, 2, -10 (esistono anche le basi negative )
    Ciao migliorabile,
    scusa l' ignoranza, ma le basi negative esistono veramente o era una battuta?
  • Re: Convertire un intero in una stringa in C

    migliorabile ha scritto:


    candaluar ha scritto:


    ...la malloc() potrebbe fallire ...
    Se una malloc fallisce, direi che hai ben altri e mostruosamente piu' gravi problemi da risolvere
    E' vero però questo non è un buon motivo per non considerare questa possibilità.
    Invece di andare in crash è molto meglio segnalare il problema di "memoria esaurita".

    "La cosa peggiore che una persona possa fare è ignorare o coprire un problema" Masaaki Imai
Devi accedere o registrarti per scrivere nel forum
7 risposte