我正在处理一个包含文本的char [],它应该表示一个双精度数值或一个长数字。
我需要编写一个函数来检测上面哪些数据类型被表示(如果有的话)。检测一个字符串是一个双精度还是长精度C
我想过使用strtol()并检查它是否无法解析整个字符串,如果失败,请使用strtod()。
我很高兴看到是否有更好的选择这样做。 谢谢。
我正在处理一个包含文本的char [],它应该表示一个双精度数值或一个长数字。
我需要编写一个函数来检测上面哪些数据类型被表示(如果有的话)。检测一个字符串是一个双精度还是长精度C
我想过使用strtol()并检查它是否无法解析整个字符串,如果失败,请使用strtod()。
我很高兴看到是否有更好的选择这样做。 谢谢。
我想过使用strtol()并检查它是否无法解析整个字符串,如果失败,请使用strtod()。
我认为这是一个好主意,我不认为有更好的主意。实现你自己的解析例程通常是一个坏主意。
在调用strtol
以避免错误的否定之前,我会从尾部的空白处修剪字符串。
'strtol()'不关心尾随空白;它将它作为字符串的未解释部分的一部分。 –
@JonathanLeffler如果有空白,strtol不会解析整个字符串,它会停在第一个空白处,从而“失败”解析整个字符串,因此是否定的。 –
You can use the following code to detect that.
char* isDouble = strchr(string, '.');
if (isDouble) {
// is Double here
}else {
// is long here
}
问题在于它依赖于区域,所以你不能假设浮动总是有“。”它也可能是一个“,”。 –
'1E-6'怎么样?没有小数点,但它代表双倍。 –
strtol()
and strtod()
是正确的做法。一定要使用errno
来检测整数溢出。 2独立的功能如下:
int Is_long(const char *src, long *dest) {
char *endptr;
// Clear, so it may be tested after strtol().
errno = 0;
// Using 0 here allows 0x1234, octaland decimal 1234.
long num = strtol(src, &endptr, 0);
// If +/- overflow, "" or has trailing text ...
if (errno || endptr == src || *endptr != '\0') {
return 0;
}
if (dest) *dest = num;
return 1;
}
int Is_double(const char *src, double *dest) {
char *endptr;
// In this case, detecting over/undeflow IMO is not a concern, so ignore it.
double num = strtod(src, &endptr);
// If "" or has trailing text ...
if (endptr == src || *endptr != '\0') {
return 0;
}
if (dest) *dest = num;
return 1;
}
@KlasLindbäck确实带来了的怎么办尾部空白的好点。这个答案假定它是无效的。
['strtol'](http://en.cppreference.com/w/c/string/byte/strtol)和['strtod'](http://en.cppreference.com/w/c/string/byte/strtof)函数几乎是这里的答案。 –