【发布时间】:2016-02-13 15:55:13
【问题描述】:
我在使用 inttypes 时遇到了一些问题,这里用这个小代码示例来说明:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
void print_byte(uint8_t b)
{
printf("%d%d%d%d%d%d%d%d\n",
!!(b & 128), !!(b & 64), !!(b & 32), !!(b & 16),
!!(b & 8), !!(b & 4), !!(b & 2), !!(b & 1));
}
int main()
{
FILE *f;
uint8_t bs = 8;
uint16_t bw = 100, bh = 200;
f = fopen("out", "w+");
print_byte(bs);
printf("%"PRIu8" %"PRIu16" %"PRIu16"\n", bs, bw, bh);
fprintf(f, "%"PRIu8"%"PRIu16"%"PRIu16, bs, bw, bh);
fclose(f);
f = fopen("out", "r");
fscanf(f, "%"SCNu8"%"SCNu16"%"SCNu16, &bs, &bw, &bh);
printf("%"PRIu8" %"PRIu16" %"PRIu16"\n", bs, bw, bh);
print_byte(bs);
fclose(f);
return 0;
}
给我
gcc -o test test.c && ./test
00001000
8 100 200
104 100 200
01101000
如果我在 fscanf 中将 SCNu8 更改为 SCNo8,我会得到我应该得到的结果:
00001000
8 100 200
8 100 200
00001000
问题出在哪里?我不明白为什么它对第一个代码不起作用,但是当我将该字节解释为八进制值时起作用。
【问题讨论】:
-
如果我到处使用
"%hhu%hu%hu"也会出现这个问题。 -
scanner 函数是棘手的野兽。你想测试他们返回的结果。 -
还在阅读前将三个测试变量重置为 0 并获得启发... ;-)
-
啊,是的,你是对的。我仍然不明白为什么需要这些空间。
-
当
scanf()处理整数转换时,它会扫描可能是数字一部分的字符(除非您指定了长度:"%1" PRIu8将只读取一个数字,但 @987654330 @ 将读取直到一个非数字),然后转换结果字符串。如果发生溢出,您会得到未定义的行为。