2010-01-12 9 views
13

Esto no funciona:¿Cómo hacer sprintf un char sin firmar?

unsigned char foo; 
foo = 0x123; 

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

consigo este error:

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

+0

¿Estás seguro de que el error no es "no se puede convertir el parámetro 2 de 'unsigned char' a 'char *'? –

+5

Falta un parámetro para sprintf() El primer parámetro es el buffer de salida. Todos los restantes dependen de la cadena de formato. Si solo quiere imprimir en el std use printf() (note no 's' al principio). –

+0

Le recomiendo que compruebe si 'isalnum (..) 'contra el valor hexadecimal real en lugar de imprimir arbitrariamente el valor del carácter. No todos tienen valores hexadecimales visibles, como 0x01. –

Respuesta

18

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

+0

esto funciona, tengo que usar printf en lugar de sprintf – Christoferw

+2

Sin previo aviso Llamo a printf, no sprintf, solo para dar un ejemplo del "% u" que necesita para obtener el valor decimal de el char – Ariel

5

EDITAR

snprintf es un poco más seguro. Depende del desarrollador asegurarse de que se utiliza el tamaño de búfer correcto.

Prueba esto:

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

es solo un ejemplo ... necesita sprintf en un char sin signo de algo. p es un buffer de cadena –

+0

luego obtengo estos errores: subíndice requiere matriz o puntero tipo – Christoferw

+0

necesitamos ver más código. –

3

Creo que su confusión con la forma sprintf funciona. El primer parámetro es un búfer de cadena, el segundo es una cadena de formateo y luego las variables que desea generar.

34

Antes de salir mirando caracteres sin signo que causa el problema, echar un vistazo más de cerca a esta línea:

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

El primer argumento de sprintf es siempre la cadena a la que se imprimirá el valor. Esa línea debe ser algo como:

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

A menos que quería decir en lugar de printf sprintf.

Después de corregir eso, puede usar% u en su cadena de formato para imprimir el valor de un tipo sin firmar.

+5

también, 0x123 es demasiado grande para caber en un char sin signo. Probablemente quieras foo = 123 (ascii '{'). – Dolphin

+0

@Dolphin: probablemente. Pero encajará en los sistemas donde 'UCHAR_BIT'> 8, p. Ej. DSP de 16 bits. – MSalters

1

No debe usar sprintf, ya que puede causar fácilmente un desbordamiento del búfer.

Debería preferir snprintf (o _snprintf cuando se programa con la biblioteca C estándar de Microsoft). Si ha asignado el buffer en la pila en la función local, que puede hacer:

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

Los datos puede obtener truncada pero que es claramente preferible a desbordar el buffer.