仅使用ANSI C,以公平的确定性确定C样式字符串是整数还是实数(即float/double)的最佳方法是什么?
不要使用atoi和atof,因为这些函数在失败时返回0.上次我检查0是一个有效的整数和浮点数,因此没有用于确定类型.
使用strto {l,ul,ull,ll,d}函数,因为这些函数在失败时设置errno,并且还报告转换数据的结束位置.
strtoul:http://www.opengroup.org/onlinepubs/007908799/xsh/strtoul.html
此示例假定该字符串包含要转换的单个值.
#includechar* 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)
感谢Jonathan Leffler指出我忘了先将errno设置为0.
使用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. ...