Использование scanf для чтения неподписанных char - программирование

Использование scanf для чтения неподписанных char

Я пытаюсь использовать этот код для чтения значений от 0 до 255 (без знака char).

#include<stdio.h>
int main(void)
{
    unsigned char value;

    /* To read the numbers between 0 to 255 */
    printf("Please enter a number between 0 and 255 \n");
    scanf("%u",&value);
    printf("The value is %u \n",value);

    return 0;
}

Я получаю следующее предупреждение компилятора, как ожидалось.

warning: format '% u ожидает тип' unsigned int *, но аргумент 2 имеет тип 'unsigned char *

И это мой вывод для этой программы.

Введите число от 0 до 255 45 Значение 45 Ошибка сегментации

Я получаю ошибку сегментации при запуске этого кода.

Каков наилучший способ чтения значений без знака char с помощью scanf?

4b9b3361

Ответ 1

Спецификатор %u ожидает целое число, которое вызывает поведение undefined при чтении этого значения в unsigned char. Вам нужно будет использовать спецификатор unsigned char %hhu.

Ответ 2

Для pre C99 я хотел бы написать дополнительную функцию для этого только один, чтобы избежать этой ошибки сегментации из-за undefined поведения scanf.

подход:

#include<stdio.h>
int my_scanf_to_uchar(unsigned char *puchar)
{
  int retval;
  unsigned int uiTemp;
  retval = scanf("%u", &uiTemp);
  if (   retval == 1
      && uiTemp < 256;
     )
  {
    *puchar = uiTemp;
  }
  return retval;
}

Затем замените < scanf ( "% u", > с < my_scanf_to_uchar ( >

Надеюсь, это не вне темы, поскольку я все еще использовал scanf, а не другую функцию, например getchar:)

Другой подход (без дополнительной функции)

if (scanf("%u", &uiTemp) == 1 && uiTemp < 256) { value = uitemp; }
else {/* Do something for conversion error */}