Converti variabile di Array in C

A

Aiuto

Guest
Salve,

Qualcuno sa come convertire la variabile di elementi di matrice?

Ex.
int Var = 12345;

dopo aver convertito:

char VarAry [] = ( "12345"), oppure
char VarAry [] = ('1 ', '2', '3 ', '4', '5 ');

2Q: Come possiamo conoscere direttamente quante cifre che abbiamo in Var?Da lì possiamo conoscere abbiamo 5digits.

Si prega di guida di me a scrivere il programma C ...

Grazie.

 
La soluzione è semplice da usare sprintf.Farà la conversione e vi dirò il numero di caratteri che ha scritto.Tuttavia, sprintf è grande.Se avete bisogno di una piccola funzione, verificare la libreria del compilatore per vedere se si fornisce un int-to-funzione di stringa.Se ancora non fortuna, qualcuno può forse aiutare a scrivere uno.

Mi viene in mente un paio di modi per calcolare il numero di cifre prima di fare la conversione:
1.Una serie di confronti: è superiore a 9?Superiore al 99?Superiore a 999?
2.Se il numero è maggiore di zero, calcolare 1 piano (log10 (Var))
Last edited by echo47 il 15 Novembre, 2006 6:24, modificato 1 volta in totale

 
Salve,

echo47 ha scritto:Mi viene in mente un paio di modi per calcolare il numero di cifre prima di fare la conversione:

1.
Una serie di confronti: è superiore a 9?
Superiore al 99?
Superiore a 999?

2.
Se il numero è maggiore di zero, calcolare 1 piano (log10 (Var))
 
Ecco un esempio del metodo sprintf:

Codice:

# include <stdio.h>int main ()

(

int cifre, Var = 12345;

char VarAry [20];cifre = sprintf (VarAry, "% d", Var);

printf ( "Var =% d VarAry =% s cifre =% d \ n", cifre Var, VarAry,);

return 0;

)
 
Salve,

La ringrazio per il vostro programma di esempio.E 'molto utile.Ringrazio molto.

Il sprintf è grande.Non hai alcun modo alternativo solo per scoprire quante cifre che hanno Var?

Grazie.
Last edited by Guida il 15 nov 2006 10:43, modificato 2 volte in totale

 
Forse fare qualcosa di simile a questa:
Codice:

unsigned decimal_digits (var unsigned)

(

if (var <= 9) return 1;

if (var <= 99) return 2;

if (var <= 999) return 3;

if (var <= 9999) return 4;

if (var <= 99999) return 5;

return 0; / * errore, io ho solo cinque dita sulla mia mano * /

)
 
echo47 ha scritto:

Forse fare qualcosa di simile a questa:Codice:

unsigned decimal_digits (var unsigned)

(

if (var <= 9) return 1;

if (var <= 99) return 2;

if (var <= 999) return 3;

if (var <= 9999) return 4;

if (var <= 99999) return 5;

return 0; / * errore, troppe cifre * /

)
 
Io non capisco la sua preoccupazione per "valore costante".Se si chiama decimal_digits con 42.539, esso restituisce "5".Naturalmente, se si vuole misurare valori superiori a 99.999, è necessario aggiungere più "if".

E 'impossibile dire se questo è il modo più efficace per il codice della funzione.Non so il tipo di processore, o il tipo di compilatore, o la tua valori tipici di "var".Anche se io sapevo queste cose, io probabilmente non hai il compilatore di test.

Si può usare strlen per misurare la lunghezza di una stringa.Tu non vuoi sizeof.

 
Salve,

Ci dispiace, ora poi ho capito già.Grazie.

Quindi, è meglio usare il modo "if" per verificare le cifre.I più veloce pensare.

Sto scrivendo il codice 8051 UC, che usa il linguaggio C.Sto usando il compilatore Keil.E 'molto buono compilatore, è possibile simulare il codice di ogni passo del tempo ELAP.È per questo che a volte mi cura la velocità durante l'esecuzione del codice di routing e la dimensione del programma perché il uC memoria interna ha limitazione.

Non hai la minima idea ..per convertire la variabile stringa?

Grazie mille.

 
Di cosa hai bisogno è di serie C itoa funtion Biblioteca, se il tuo compilatore non supportano itoa, si può costruire il vostro itoa proprio come questo:
Codice:# include <string.h>

void itostr (unsigned int val, unsigned char * result)

(

static char buf [32] = (0);

int i = 30;for (; val val & & i, - i, / = 10)

buf = "0123456789" [% val 10];

strcpy (risultato, & buf [i 1]);

)
 
Alcuni compilatori fornire un itoa (o simile) la funzione, ma non è uno standard ANSI C funzione.Se lo si utilizza, si ricordi che il codice non può essere portabile su altri compilatori.

Per alcuni esempi di conversione di altri, vedi il "Google Groups" link di ricerca qui sopra.

 
Salve,

Codice:# include <string.h>

void itostr (unsigned int val, unsigned char * result)

(

static char buf [32] = (0);

int i = 30;for (; val val & & i, - i, / = 10)

buf = "0123456789" [% val 10];

strcpy (risultato, & buf [i 1]);

)
 
Nulla di ciò che itostr '' restituisce la funzione (si è dichiarata 'vuoto').Tuttavia, scrive una stringa in array di char puntato da 'risultato'.Ecco un esempio chiamando la funzione:

Codice:

# include <stdio.h>

int main ()

(

unsigned Var = 12345;

char VarAry [32];itostr (Var, VarAry);

printf ( "Var =% u VarAry =% s \ n", Var, VarAry);

return 0;

)
 
echo47 ha scritto:

'itostr' è inefficiente.
Mi consiglia di pulirlo prima di usarlo per un lavoro serio.
 
Funziona, ma è inefficace:
1.Scrive la stringa in un buffer temporaneo e quindi copia il buffer temporaneo per il buffer di output, invece di scrivere la stringa direttamente nel buffer di output.
2.I consuma 32 byte di dati in memoria anche quando la funzione non è in esecuzione.
3.Si richiede due divisioni per l'output di caratteri, a meno che l'ottimizzatore del compilatore è molto intelligente.(Divisione di solito è un'operazione costosa.) Determinare come l'ottimizzatore è intelligente, è possibile esaminare la sua produzione assembler.

 
Salve,

La ringrazio per la vostra buona spiegazione.Dalla tua spiegazione sembrare semplicemente utilizzare i dati da memorizzare nella memoria di archiviazione e ha preso un sacco di tempo per passare il valore del buffer.

Non hai qualche buona idea?Come possiamo fare più efficiente?I gruppi di ricerca da Google, non ci ho qualche esempio, ma ci sono voluti più tempo per l'esecuzione.
ex1:
Codice:

char * itos (char * s, int i)

(Char * r = s;

int t;

if (i <0)

(I =-i;

* s = '-';

)

t = i;

fare

s;

while (t / = 10);* s = '\ 0';fare

*-- s = '0 ' % i 10;

while (i / = 10);return s;

)
 
Ouch!Questi due richiedere fino a tre divisioni per carattere, a seconda della qualità Optimizer.

Prestazioni dipende dal tipo di CPU e la qualità Optimizer.Che CPU e il compilatore stai usando?Forse qualcuno qui ha familiarità con la combinazione specifica.

Controllare la documentazione del compilatore per vedere se fornisce un adeguato ben ottimizzata funzione di libreria.

 
Salve,

Sto usando AT89C52 Microcontroller e compilatore Keil che ho utilizzato.Il mio compilatore non è che hanno solo la funzione Data-Convertion (ad esempio: Converte una stringa in un float, Converte una stringa in un int, e così via).

Ringraziare ancora una volta ....

 

Welcome to EDABoard.com

Sponsor

Back
Top