2010-01-12 14 views
13

To nie działa:Jak sprintf unsigned char?

unsigned char foo; 
foo = 0x123; 

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

otrzymuję ten błąd:

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

+0

Czy na pewno błąd nie jest "nie można przekonwertować parametru 2 z" unsigned char "na" char * "? –

+5

Brakuje parametru dla sprintf() Pierwszym parametrem jest bufor wyjściowy. Wszystkie pozostałe są zależne od łańcucha formatu .Jeśli po prostu chcesz wydrukować na standardowe wyjście użyj printf() (nie notuj "s" na początku) –

+0

Polecam sprawdzić, czy to 'isalnum (..) 'versus rzeczywistą wartość szesnastkową zamiast arbitralnie drukować wartość znaku.Nie wszystkie mają widoczne wartości szesnastkowe, takie jak 0x01. –

Odpowiedz

18

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

+0

to działa, muszę użyć printf zamiast sprintf – Christoferw

+2

Nie - zawiadomię, że dzwonię printf, nie sprintf, po prostu podać przykład "% u", musisz uzyskać wartość dziesiętną z char. – Ariel

5

EDIT

snprintf jest trochę bardziej bezpieczniejsze. Od dewelopera zależy, czy użyje się odpowiedniego rozmiaru bufora.

Spróbuj:

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

to tylko przykład .. trzeba sprintf do unsigned char of something .P jest bufor string –

+0

następnie dostaję ten błąd: indeks dolny wymaga tablicy lub wskaźnika typu – Christoferw

+0

musimy zobaczyć więcej kodu. –

3

Wydaje mi się, że jesteś zdezorientowany ze sposobem, w jaki działa sprintf. Pierwszy parametr to bufor łańcuchowy, drugi to ciąg formatujący, a następnie zmienne, które chcesz wyprowadzić.

34

Zanim zgaśnie patrząc na niepodpisane zwęgla powoduje problem, warto bliżej przyjrzeć się tej linii:

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

Pierwszym argumentem sprintf jest zawsze łańcuch, do którego wartość zostanie wydrukowany. Linia powinna wyglądać następująco:

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

O ile nie chodziło o printf zamiast sprintf.

Po ustaleniu tego, możesz użyć% u w ciągu znaków, aby wydrukować wartość typu bez znaku.

+5

także, 0x123 jest zbyt duży, aby zmieścić się w unsigned char. Prawdopodobnie chcesz foo = 123 (ascii "{'). – Dolphin

+0

@Dolphin: prawdopodobnie. Ale będzie pasować do tych systemów, w których 'UCHAR_BIT'> 8, np. 16-bitowe DSP. – MSalters

1

Nie należy używać sprintf, ponieważ może to łatwo spowodować przepełnienie bufora.

Powinieneś preferować snprintf (lub _snprintf podczas programowania ze standardową biblioteką C firmy Microsoft). Jeśli przydzielane bufora na stosie w funkcji lokalnym, można zrobić:

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

Dane mogą uzyskać obcięty, ale to jest zdecydowanie korzystniejsze przepełnienia bufora.