如何使用scanfunsigned int
我有以下几点如何使用scanfunsigned int,c,scanf,C,Scanf,我有以下几点 unsigned int value = 12; int res = std::sscanf("-567", "%u", &value); 运行此操作时,res为1表示1匹配,值设置为4294966729 而我却不希望有任何匹配 如果有人能解释这种行为,我将不胜感激。这是因为每个负值integer都有其相应的无符号整数值,如果要检查是否输入了正值,则必须将其声明为int类型并检查其值: long int value: unsigned int value_ui; sc
unsigned int value = 12;
int res = std::sscanf("-567", "%u", &value);
运行此操作时,res为1表示1匹配,值设置为4294966729
而我却不希望有任何匹配
如果有人能解释这种行为,我将不胜感激。这是因为每个负值integer都有其相应的无符号整数值,如果要检查是否输入了正值,则必须将其声明为int类型并检查其值:
long int value:
unsigned int value_ui;
scanf("%ld",&value);
if(value<0)
printf("error");
else
value_ui=(unsigned int) value;
long int值:
无符号整数值;
scanf(“%ld”、&value);
如果(值给出了你使用的代码> STD::sChanff()/Cuffe,你实际上使用的是C++,而不是C,但是C++的代码< ScScFor()/Cuth>的行为与C. 基本相同。
%u
格式说明符的规范允许包含符号。这基本上意味着将使用模运算。假设32无符号int
类型,结果将是模4294967296
以产生介于0
和4294967295
-567
之间的值dulo4294967296
(即用-567
除以4294967296
得到的最小正余数)是4294966729
<
“…其格式与strtoul
函数的主题序列的预期格式相同,基本参数的值为10…”
以及
“…如果主题序列以减号开头,则转换产生的值为负数…”
#包括
内部主(空){
无符号整数值;
国际关系;
res=sscanf(“-567”、“%u”、&value);
如果(res==1){
printf(“值:%u\n”,值);
}否则{
fprintf(stderr,“Error\n”);
}
res=sscanf(“567”、“%u”、&value);
如果(res==1){
value=~value+1;//在两个补码机器中添加1
printf(“值:%u\n”,值);
}否则{
fprintf(stderr,“Error\n”);
}
返回0;
}
如果你浏览sscanf
函数的文档,你会发现sscanf
的返回类型是填充的变量数量,在这种情况下,它本质上是一个变量,即变量值
。另外值
显示了一个非常大的数字,因为你在其中存储了一个负整数并显示i以无符号整数格式对其进行ng。这将导致模运算,最终结果将为(-567)%(max unsigned integer value)。简而言之,它将是567的两个补码。如果相反,您为value
使用了%d格式说明符,它将仅显示-567。有关sscanf
用法的更多详细信息,请参阅以下链接:
对于C:
对于C++:
std::sscanf
在我看来不太像C
。你怎么期望-567
被表示为一个无符号值?@stackptrsnscanf
与避免溢出无关。@rustyx抱歉,被snprintf
@stackptrsnprintf
与av无关避免溢出:)if(value@AlterMann当我写值时,我的意思是输入int类型,而不是无符号intOk,那么你应该声明值为长int
在0-UINT\u MAX
范围内(有符号int的溢出是未定义的行为)有趣。谁会想到strtoul
被指定为快乐地吃负整数呢?
#include <stdio.h>
int main(void) {
unsigned int value;
int res;
res = sscanf("-567", "%u", &value);
if (res == 1) {
printf("Value: %u\n", value);
} else {
fprintf(stderr, "Error\n");
}
res = sscanf("567", "%u", &value);
if (res == 1) {
value = ~value + 1; // add 1 in two's complement machines
printf("Value: %u\n", value);
} else {
fprintf(stderr, "Error\n");
}
return 0;
}