ANSI C (ISO C90): Может ли scanf читать/принимать беззнаковые символы?

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

пример кода 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 можно использовать в этой ситуации?


person Tim    schedule 09.02.2010    source источник
comment
Измените -ansi на -std=c99, если вам не нужен код для работы в Windows.   -  person zwol    schedule 20.09.2013


Ответы (2)


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

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

person Jonathan Leffler    schedule 09.02.2010

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

person nos    schedule 09.02.2010
comment
Unsigned short был бы лучшим типом данных, так как это 16 бит ... просто уберите старшие 8 бит .. :) - person t0mm13b; 09.02.2010
comment
@ tommieb75: Нет гарантии, что unsigned short будет 16-битным. Нет никакой гарантии, что unsigned char будет 8-битным. - person jamesdlin; 09.02.2010
comment
@jamesdlin: я согласен ... из-за разных процессоров / компиляторов / компоновщиков / сред выполнения ... : O :) - person t0mm13b; 10.02.2010
comment
@jamesdlin: я считаю, что есть гарантия, что char имеет длину не менее 8 бит, что достаточно - person Matt Joiner; 19.06.2010
comment
@Matt Joiner: Да, но моя точка зрения заключалась в том, что вы не можете просто сбросить старшие 8 бит (как предложил tommieb76) и что вы должны выполнить проверку диапазона (как предложил nos). - person jamesdlin; 19.06.2010