2010-01-12 15 views
13

Questo non funziona:Come sprintf un char non firmato?

unsigned char foo; 
foo = 0x123; 

sprintf("the unsigned value is:%c",foo); 

ottengo questo errore:

cannot convert parameter 2 from 'unsigned char' to 'char'

+0

Sei sicuro che l'errore non è "impossibile convertire il parametro 2 da" unsigned char "a" char * "? –

+5

Manca un parametro a sprintf() Il primo parametro è il buffer di output. stringa.Tutti i rimanenti dipendono dalla stringa di formato.Se vuoi solo stampare a std out usa printf() (nota no 's' all'inizio) –

+0

Ti consiglio di controllare se è 'isalnum (..) 'rispetto al valore esadecimale effettivo invece di stampare arbitrariamente il valore del carattere.Non tutti hanno valori esadecimali visibili come 0x01. –

risposta

18

printf ("% u", 'c');

+0

questo funziona, devo usare printf invece di sprintf – Christoferw

+2

No - avviso sto chiamando printf, non sprintf, solo per dare un esempio di "% u" è necessario ottenere il valore decimale di il char. – Ariel

5

EDIT

snprintf è un po 'più sicuro. Spetta allo sviluppatore assicurarsi che venga utilizzata la giusta dimensione del buffer.

Prova questo:

char p[255]; // example 
unsigned char *foo; 
... 
foo[0] = 0x123; 
... 
snprintf(p, sizeof(p), " 0x%X ", (unsigned char)foo[0]); 
+1

è solo un esempio .. è necessario sprintf in un char unsigned di qualcosa.p è un buffer di stringa –

+0

quindi ottengo questo errore: pedice richiede un tipo di array o puntatore – Christoferw

+0

abbiamo bisogno di vedere più codice. –

3

Penso che la tua confusione con il modo in cui sprintf funziona. Il primo parametro è un buffer di stringa, il secondo è una stringa di formattazione e quindi le variabili che si desidera esportare.

34

Prima di andare fuori guardando caratteri senza segno la causa del problema, dare un'occhiata più da vicino a questa linea:

sprintf("the unsigned value is:%c",foo); 

Il primo argomento di sprintf è sempre la stringa a cui verrà stampato il valore. La riga deve essere simile a:

sprintf(str, "the unsigned value is:%c",foo); 

A meno che non si intendesse printf anziché sprintf.

Dopo aver corretto ciò, è possibile utilizzare% u nella stringa di formato per stampare il valore di un tipo senza segno.

+5

, 0x123 è troppo grande per rientrare in un char non firmato. Probabilmente vuoi foo = 123 (ascii '{'). – Dolphin

+0

@Dolphin: probabilmente. Ma si adatta a quei sistemi in cui 'UCHAR_BIT'> 8, ad es. DSP a 16 bit. – MSalters

1

Non utilizzare sprintf poiché può facilmente causare un overflow del buffer.

Si consiglia di preferire snprintf (o _snprintf quando si programma con la libreria C standard di Microsoft). Se avete assegnato il buffer sullo stack nella funzione locale, si può fare:

char buffer[SIZE]; 
snprintf(buffer, sizeof(buffer), "...fmt string...", parameters); 

I dati possono ottenere troncati, ma che è sicuramente preferibile traboccare il buffer.

Problemi correlati