Ответ 1
Спецификатор %u
ожидает целое число, которое вызывает поведение undefined при чтении этого значения в unsigned char
. Вам нужно будет использовать спецификатор unsigned char
%hhu
.
Я пытаюсь использовать этот код для чтения значений от 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?
Спецификатор %u
ожидает целое число, которое вызывает поведение undefined при чтении этого значения в unsigned char
. Вам нужно будет использовать спецификатор unsigned char
%hhu
.
Для 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 */}