2010-02-09 3 views
15

Простой вопрос: Может ли scanf считывать/принимать «небольшое целое число» в unsigned char в ANSI C?ANSI C (ISO C90): Может ли scanf считывать/принимать символ без знака?

пример кода un_char.c:

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

int main(void) 
{ 
    unsigned char character; 

    scanf("%hhu", &character); 

    return EXIT_SUCCESS; 
} 

Составитель как:

$ 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 не поддерживается ISO C90. Итак, какое преобразование scanf можно использовать в этой ситуации?

+0

Измените '-ansi' на' -std = c99', если вам не нужен ваш код для работы в Windows. – zwol

ответ

3

Прочитайте его в unsigned short/int и выполните некоторые проверки диапазона, если вам нужно.

+0

Беззнаковый короткий будет лучшим типом данных, так как это 16 бит ... просто сбить верхние 8 бит .. :) – t0mm13b

+1

@ tommieb75: Нет гарантии, что 'unsigned short' - 16 бит. Нет никакой гарантии, что 'unsigned char' тоже 8 бит. – jamesdlin

+0

@jamesdlin: Я согласен ... из-за разных процессоров/компиляторов/компоновщиков/среды выполнения ...: O :) – t0mm13b

11

No: C89 (C90) не поддерживает '%hhu', чтобы прочитать строку цифр в символ без знака. Это особенность на C99.

Вам нужно будет прочитать целое число без знака ('%u') или неподписанное короткое ('%hu'), а затем проверить, что результат имеет диапазон беззнакового символа.