如何使用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
之间的值dulo
4294967296
(即用
-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
被表示为一个无符号值?@stackptr
snscanf
与避免溢出无关。@rustyx抱歉,被
snprintf
@stackptr
snprintf
与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;
}