用逗号分隔符和 sscanf 分隔整数
Posted
技术标签:
【中文标题】用逗号分隔符和 sscanf 分隔整数【英文标题】:Separated integers with comma delimiters and sscanf 【发布时间】:2013-12-05 20:54:34 【问题描述】:我需要 sscanf 方面的帮助。 我有一个数据文件。我逐行阅读。 一行是这样的:23,13,45;
我想读取整数。 我试试这段代码:
unsigned char a,b,c;
sscanf(line,"%d,%d,%d;",&a,&b,&c);
但这不起作用,只读取第一个数字,其他为0。
【问题讨论】:
【参考方案1】:这是因为%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
,或更改格式说明符。
【讨论】:
【参考方案2】:unsigned char
的正确格式说明符是 %hhu
。
除此之外,只要line
包含您期望的格式的字符串,我看不出任何问题。
【讨论】:
对于%d
sscanf() 需要signed int*
,但您将指针传递给unsigned char
,即undefined behaviour。以上是关于用逗号分隔符和 sscanf 分隔整数的主要内容,如果未能解决你的问题,请参考以下文章