我有以下
unsigned int value = 12;
int res = std::sscanf("-567", "%u", &value);
Run Code Online (Sandbox Code Playgroud)
运行时 res 为 1 表示 1 个匹配,值设置为 4294966729 而我期望没有匹配
如果有人能解释这种行为,我将不胜感激。
“...其格式与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)
发生这种行为是因为每个负整数都有一个相应的无符号值,允许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)
| 归档时间: |
|
| 查看次数: |
23365 次 |
| 最近记录: |