【发布时间】:2013-12-05 20:54:34
【问题描述】:
我需要 sscanf 方面的帮助。 我有一个数据文件。我逐行阅读。 一行是这样的:23,13,45;
我想读取整数。 我试试这段代码:
unsigned char a,b,c;
sscanf(line,"%d,%d,%d;",&a,&b,&c);
但这不起作用,只读取第一个数字,其他为0。
【问题讨论】:
我需要 sscanf 方面的帮助。 我有一个数据文件。我逐行阅读。 一行是这样的:23,13,45;
我想读取整数。 我试试这段代码:
unsigned char a,b,c;
sscanf(line,"%d,%d,%d;",&a,&b,&c);
但这不起作用,只读取第一个数字,其他为0。
【问题讨论】:
这是因为%d 需要一个指向 4 字节整数的指针,而您正在传递一个指向 1 字节 char 的指针。因为变量a、b和c是按照内存地址从小到大的顺序存储的,所以sscanf首先用23填充a,同时用零填充栈内存的其他3个字节(这是内存违规,顺便说一句)。然后它用 13 填充b,还用零填充a 和另外两个字节。最后它用 45 填充c,还用零填充a 和b 以及另一个字节。这样一来,b 和 a 中的值都为零,而 c 中只有一个期望值。
当然,这只是可能发生的一种情况,因为它取决于架构和编译器。
读取 4 个整数的正确方法是使用 int 而不是 unsigned char,或更改格式说明符。
【讨论】:
unsigned char 的正确格式说明符是 %hhu。
除此之外,只要line 包含您期望的格式的字符串,我看不出任何问题。
【讨论】:
%d sscanf() 需要signed int*,但您将指针传递给unsigned char,即undefined behaviour。