在C中检测字符串是双精度字符串还是长字符串

在C中检测字符串是双精度字符串还是长字符串,c,double,long-integer,C,Double,Long Integer,我正在处理一个包含文本的char[],该文本应该表示一个双数值或一个长数值。 我需要编写一个函数来检测上面哪些数据类型被表示(如果有的话) 我考虑过使用strtol()并检查它是否无法解析整个字符串,如果失败,则使用strtod() 我很高兴看到是否有更好的选择。 谢谢 我考虑过使用strtol()并检查它是否无法解析整个字符串,如果失败,则使用strtod() 我认为这是一个好主意,我认为没有比这更好的了。实现自己的解析例程通常是个坏主意 在调用strtol之前,我会从尾部空白处修剪字符串,以

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

我考虑过使用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
不会解析整个字符串,它将在第一个空格处停止,从而“无法”解析整个字符串,因此为假阴性。