23

我正在尝试使用此代码读取 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;
}

我确实按预期收到了以下编译器警告。

警告:格式“%u”需要类型“unsigned int *”,但参数 2 的类型为“unsigned char *”

这是我对这个程序的输出。

请输入 0 到 255 之间的数字
45
值为 45
分段故障

运行此代码时,我确实遇到了分段错误。

使用读取unsigned char值的最佳方法是什么scanf

4

2 回答 2

42

说明%u符需要一个整数,当将其读入unsigned char. 您将需要使用说明unsigned char%hhu

于 2013-01-03T20:46:16.033 回答
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 */}
于 2017-03-23T09:53:59.517 回答