2014-02-11 44 views
0

我正在处理一个包含文本的char [],它应该表示一个双精度数值或一个长数字。
我需要编写一个函数来检测上面哪些数据类型被表示(如果有的话)。检测一个字符串是一个双精度还是长精度C

我想过使用strtol()并检查它是否无法解析整个字符串,如果失败,请使用strtod()。

我很高兴看到是否有更好的选择这样做。 谢谢。

+4

['strtol'](http://en.cppreference.com/w/c/string/byte/strtol)和['strtod'](http://en.cppreference.com/w/c/string/byte/strtof)函数几乎是这里的答案。 –

回答

2

我想过使用strtol()并检查它是否无法解析整个字符串,如果失败,请使用strtod()。

我认为这是一个好主意,我不认为有更好的主意。实现你自己的解析例程通常是一个坏主意。

在调用strtol以避免错误的否定之前,我会从尾部的空白处修剪字符串。

+0

'strtol()'不关心尾随空白;它将它作为字符串的未解释部分的一部分。 –

+0

@JonathanLeffler如果有空白,str​​tol不会解析整个字符串,它会停在第一个空白处,从而“失败”解析整个字符串,因此是否定的。 –

-2
You can use the following code to detect that. 

char* isDouble = strchr(string, '.'); 
if (isDouble) { 
    // is Double here 
}else { 
    // is long here 
} 
+0

问题在于它依赖于区域,所以你不能假设浮动总是有“。”它也可能是一个“,”。 –

+0

'1E-6'怎么样?没有小数点,但它代表双倍。 –

1

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确实带来了的怎么办尾部空白的好点。这个答案假定它是无效的。