如何使用 scanf unsigned int

Dou*_*uid 3 c scanf

我有以下

 unsigned int value = 12;
 int res = std::sscanf("-567", "%u", &value);
Run Code Online (Sandbox Code Playgroud)

运行时 res 为 1 表示 1 个匹配,值设置为 4294966729 而我期望没有匹配

如果有人能解释这种行为,我将不胜感激。

pmg*_*pmg 5

C11标准状态

“...其格式与strtoul函数主题序列的预期相同,基本参数的值为 10...”

并且,对于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;
}
Run Code Online (Sandbox Code Playgroud)

  • 有趣的。谁会想到`strtoul` 被*指定* 快乐地吃负整数? (3认同)

Dr.*_*itz 1

发生这种行为是因为每个负整数都有一个相应的无符号值,允许sscanf解析unsigned int. 如果要确保sscanf匹配正整数,则必须将字符串解析为十进制整数 ( "%d") 并使用if语句:

long int value:
unsigned int value_ui;
scanf("%ld", &value);

if (value < 0)
    printf("error");
else
    value_ui = (unsigned int) value;
Run Code Online (Sandbox Code Playgroud)

  • 当“value”声明为“unsigned int”时,“if(value&lt;0)”总是 false,不是吗? (5认同)