2010-02-09 18 views
15

Pregunta simple: ¿Scanf puede leer/aceptar un "pequeño entero" en un carácter sin signo en ANSI C? códigoANSI C (ISO C90): ¿Puede scanf leer/aceptar un carácter no firmado?

ejemplo un_char.c:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    unsigned char character; 

    scanf("%hhu", &character); 

    return EXIT_SUCCESS; 
} 

compilado como:

$ gcc -Wall -ansi -pedantic -o un_char un_char.c 
un_char.c: In function ‘main’: 
un_char.c:8: warning: ISO C90 does not support the ‘hh’ gnu_scanf length modifier 

hh no es compatible con ISO C90. Entonces, ¿qué conversión de escaneo se puede utilizar en esta situación?

+0

Cambia '-ansi' a' -std = c99' si no necesitas que tu código funcione en Windows. – zwol

Respuesta

3

Léelo en un corto/int sin firmar y revisa el rango si es necesario.

+0

El corto sin signo sería el mejor tipo de datos ya que son 16 bits ... simplemente quita los 8 bits superiores .. :) – t0mm13b

+1

@ tommieb75: No hay garantía de que 'corto sin firmar' sea de 16 bits. No hay garantía de que 'char sin signo 'sea de 8 bits tampoco. – jamesdlin

+0

@jamesdlin: Estoy de acuerdo ... debido a los diferentes procesadores/compiladores/vinculadores/entornos de tiempo de ejecución ...: O :) – t0mm13b

11

No: C89 (C90) no admite '%hhu' para leer una cadena de dígitos en un carácter no firmado. Esa es una característica en C99.

Debería leer un entero sin signo ('%u') o un corto sin signo ('%hu') y luego verificar que el resultado esté dentro del rango de un carácter sin signo.

Cuestiones relacionadas