使用scanf读取未签名字符
我正在尝试使用此代码读取0到255之间的值(使用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之间的数字*/
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 yeshh
被标记为黄色,这意味着它是从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 */}