在C中检测字符串是双精度字符串还是长字符串
我正在处理一个包含文本的char[],该文本应该表示一个双数值或一个长数值。在C中检测字符串是双精度字符串还是长字符串,c,double,long-integer,C,Double,Long Integer,我正在处理一个包含文本的char[],该文本应该表示一个双数值或一个长数值。 我需要编写一个函数来检测上面哪些数据类型被表示(如果有的话) 我考虑过使用strtol()并检查它是否无法解析整个字符串,如果失败,则使用strtod() 我很高兴看到是否有更好的选择。 谢谢 我考虑过使用strtol()并检查它是否无法解析整个字符串,如果失败,则使用strtod() 我认为这是一个好主意,我认为没有比这更好的了。实现自己的解析例程通常是个坏主意 在调用strtol之前,我会从尾部空白处修剪字符串,以
我需要编写一个函数来检测上面哪些数据类型被表示(如果有的话) 我考虑过使用strtol()并检查它是否无法解析整个字符串,如果失败,则使用strtod() 我很高兴看到是否有更好的选择。 谢谢 我考虑过使用strtol()并检查它是否无法解析整个字符串,如果失败,则使用strtod() 我认为这是一个好主意,我认为没有比这更好的了。实现自己的解析例程通常是个坏主意 在调用
strtol
之前,我会从尾部空白处修剪字符串,以避免误判。strtol()
和strtod()
是正确的方法。确保使用errno
检测整数溢出。2个独立功能如下:
You can use the following code to detect that.
char* isDouble = strchr(string, '.');
if (isDouble) {
// is Double here
}else {
// is long here
}
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, octal 0123 and 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;
}
@克拉斯·林德贝克确实提出了如何处理尾随空白的好观点。此答案假定它无效。和函数基本上就是这里的答案。问题是它取决于区域,因此您不能假定浮点始终有“.”它也可以是“.”。那么
1E-6
呢?没有小数点,但表示双精度。strtol()
不关心尾随空格;它将其作为字符串未解释部分的一部分。@JonathanLeffler如果有尾随空格,strtol
不会解析整个字符串,它将在第一个空格处停止,从而“无法”解析整个字符串,因此为假阴性。