我正在尝试使用此代码读取0到255之间的值(unsigned 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’ expects type ‘unsigned int *’, but argument 2 has type ‘unsigned char *’
这是我对该计划的输出。
Please enter a number between 0 and 255 45 The value is 45 Segmentation fault
运行此代码时,我确实遇到了分段错误。
使用unsigned char
阅读scanf
值的最佳方式是什么?
答案 0 :(得分:35)
%u
说明符需要一个整数,当将其读入unsigned char
时会导致未定义的行为。您需要使用unsigned char
说明符%hhu
。
答案 1 :(得分:2)
对于前C99,我会考虑为此编写一个额外的功能 仅仅是为了避免由于scanf的未定义行为引起的分段错误。
方法:
#include<stdio.h>
int my_scanf_to_uchar(unsigned char *puchar)
{
int retval;
unsigned int uiTemp;
retval = scanf("%u", &uiTemp);
if (retval == 1)
{
if (uiTemp < 256) {
*puchar = uiTemp;
}
else {
retval = 0; //maybe better something like EINVAL
}
}
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 */}