使用sscanf解析十进制字符串

时间:2014-01-30 19:37:09

标签: c linux glibc scanf

我想将字符串解析为整数。 该字符串可以包含任何数据,包括无效或浮点整数。这是我的代码,显示了我如何使用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()或类似方法)。

3 个答案:

答案 0 :(得分:3)

3是一个有效的整数。遗憾的是,sscanf并不复杂,无法向前看并发现3.5float并且没有给您任何结果。

尝试使用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),则抛出错误。