我想将字符串解析为整数。
该字符串可以包含任何数据,包括无效或浮点整数。这是我的代码,显示了我如何使用sscanf()
:
errno = 0;
uint32_t temp;
int res = sscanf(string, "%"SCNu32, &temp);
if (0 != errno || 1 != res)
{
return HEX_ECONVERSION;
}
其中string作为参数传递。
我预计此代码会在"3.5"
数据上失败。但不幸的是,sscanf()
将"3.5"
截断为3
并将其写入temp
整数。
怎么了?
我是否正确使用sscanf()
?以及如何使用sscanf
来完成此任务,而无需编写手写解析器(通过直接调用strtoul()
或类似方法)。
答案 0 :(得分:3)
3
是一个有效的整数。遗憾的是,sscanf
并不复杂,无法向前看并发现3.5
是float
并且没有给您任何结果。
尝试使用strtol
并测试返回指针以查看它是否解析了整个字符串。
答案 1 :(得分:2)
使用扫描在缓冲区中的"%n"
条记录
我们可以用它来确定停止扫描的内容。
int n;
int res = sscanf(string, "%"SCNu32 " %n", &temp, &n);
if (0 != errno || 1 != res || string[n] != '\0')
return HEX_ECONVERSION;
追加" %n"
表示忽略后面的空格,然后记下缓冲区位置。如果没有像".5"
这样的其他垃圾,则string[n]
将指向空终止符。
确保在设置保险n
后测试temp
。这是通过1 != res
完成的。
"%n"
不会影响sscanf()
返回的值。
答案 2 :(得分:1)
sscanf
只解析它可以的字符串部分。您可以为其添加其他格式,例如"%d%s"
。如果%s
说明符捕获非空字符串(例如.5
),则抛出错误。