使用scanf读取unsigned char

时间:2013-01-03 20:09:54

标签: c scanf

我正在尝试使用此代码读取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值的最佳方式是什么?

2 个答案:

答案 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 */}