确定字符串是ANSI C中的整数还是浮点数

Chr*_*lan 9 c floating-point numbers

仅使用ANSI C,以公平的确定性确定C样式字符串是整数还是实数(即float/double)的最佳方法是什么?

Pat*_*k_O 34

不要使用atoi和atof,因为这些函数在失败时返回0.上次我检查0是一个有效的整数和浮点数,因此没有用于确定类型.

使用strto {l,ul,ull,ll,d}函数,因为这些函数在失败时设置errno,并且还报告转换数据的结束位置.

strtoul:http://www.opengroup.org/onlinepubs/007908799/xsh/strtoul.html

此示例假定该字符串包含要转换的单个值.

#include <errno.h>

char* to_convert = "some string";
char* p = to_convert;
errno = 0;
unsigned long val = strtoul(to_convert, &p, 10);
if (errno != 0)
    // conversion failed (EINVAL, ERANGE)
if (to_convert == p)
    // conversion failed (no characters consumed)
if (*p != 0)
    // conversion failed (trailing data)
Run Code Online (Sandbox Code Playgroud)

感谢Jonathan Leffler指出我忘了先将errno设置为0.


Pat*_*ick 9

使用sscanf,您可以确定字符串是浮点数还是整数或其他没有特殊情况0的情况,就像atoi和atof解决方案一样.

这是一些示例代码:

int i;
float f;
if(sscanf(str, "%d", &i) != 0) //It's an int.
  ...
if(sscanf(str "%f", &f) != 0)  //It's a float.
  ...
Run Code Online (Sandbox Code Playgroud)