Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scanf读取未签名字符_C_Scanf - Fatal编程技术网

使用scanf读取未签名字符

使用scanf读取未签名字符,c,scanf,C,Scanf,我正在尝试使用此代码读取0到255之间的值(无符号字符) #包括 内部主(空) { 无符号字符值; /*读取0到255之间的数字*/ printf(“请输入一个介于0和255之间的数字\n”); scanf(“%u”,和值); printf(“值为%u\n”,值); 返回0; } 我确实收到了预期的以下编译器警告 warning: format ‘%u’ expects type ‘unsigned int *’, but argument 2 has type ‘unsigned char

我正在尝试使用此代码读取0到255之间的值(
无符号字符

#包括
内部主(空)
{
无符号字符值;
/*读取0到255之间的数字*/
printf(“请输入一个介于0和255之间的数字\n”);
scanf(“%u”,和值);
printf(“值为%u\n”,值);
返回0;
}
我确实收到了预期的以下编译器警告

warning: format ‘%u’ expects type ‘unsigned int *’, but argument 2 has type ‘unsigned char *’ 警告:格式“%u”要求类型为“unsigned int*”,但参数2的类型为“unsigned char*” 这是我对这个程序的输出

Please enter a number between 0 and 255 45 The value is 45 Segmentation fault 请输入一个介于0和255之间的数字 45 值是45 分段故障 我在运行这段代码时确实遇到了分段错误


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

%u
说明符需要一个整数,当将其读入
unsigned char
时,该整数会导致未定义的行为。您需要使用<代码>无符号char <代码>指定符>代码> %HUU < /C> >

对于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; 
}

实际上,
%hhu
用于
无符号字符
@TJD。我不想读字符。我想读取0到255之间的值。@Joe。这很有效。非常感谢。user1293997:您可能想写一个答案并接受它(假设@Joe对此不感兴趣)。目前唯一的答案是非常不正确的。这很好-但是悲伤的gcc抱怨C89/C90模式-并且进一步的ms抱怨:
%hhu
据我所知在C99之前不受支持。@BastianEbeling yes
hh
被标记为黄色,这意味着它是从C99开始引入的。我想知道如何在C89中阅读它下面有一个例子现在被删除了,它使用了。为什么这个getchar()例子被删除了,偏离了主题?
#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; 
}
if (scanf("%u", &uiTemp) == 1 && uiTemp < 256) { value = uitemp; }
else {/* Do something for conversion error */}