如果字符串等于零,则返回strtod()的值

时间:2015-01-15 21:58:24

标签: c error-handling strtod

根据MSDN:

    如果无法执行转换或发生下溢,则
  • strtod返回0.

如果我的字符串等于零(即0.0000)怎么办?我怎么知道转换是否没有错误?

好的,我使用以下代码来验证这个想法:

char    *Y = "XYZ";
double  MyNum;
char    *MyEndPtr;
int     Err_Conversion = 0;

errno = 0;  //reset
MyNum = strtod (Y, &MyEndPtr);

if ( (MyNum == 0) && (errno != 0) && (strcmp(Y, MyEndPtr) == 0) )
        { Err_Conversion = 1;   }

我看到MyNum = 0,但在此强制错误中从未看到Y的内容被复制到MyEnPtr或errno = 0。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

使用该功能的str_end参数。例如:

const char* str = "123junk";
char* str_end;
double d = strtod(str, &str_end);
// Here:
//   d will be 123
//   str_end will point to (str + 3) (the 'j')

// You can tell the string has some junk data if *str_end != '\0'
if (*str_end != '\0') {
    printf("Found bad data '%s' at end of string\n", str_end);
}

如果转换完全失败,str将等于str_end

const char* str = "junk";
char* str_end;
double d = strtod(str, &str_end);
// Here:
//   d will be 0 (conversion failed)
//   str_end will equal str

if (str == str_end) {
    printf("The string doesn't start with a number!\n");
}

您可以结合使用这两种方法来确保(完全)成功转换字符串(即通过检查str != str_end && *str_end == '\0'

答案 1 :(得分:2)

签名是(给予或接受restrict个关键字):

 double strtod(const char *nptr, char **endptr);

如果传递非空指针作为第二个参数,如果它不能执行转换,则返回值为nptr的值。如果它在输入字符串中找到了真正的零,那么*endptr中存储的值将不会是nptr

char *end;
const char *data = "0.00000";

errno = 0;
double d = strtod(data, &end);
if (end != data)
    ...a conversion was performed...
else
    ...trouble...

您也可以查看errno,但是在调用之前需要将其归零,因为标准C库或POSIX库中的任何函数都不会将errno设置为零。

标准说:

  

如果主题序列为空或者没有预期的形式,则不进行转换; nptr的值存储在endptr指向的对象中,前提是endptr不是空指针。

     

返回

     

函数返回转换后的值(如果有)。如果无法执行转换,则返回零。如果正确的值溢出且默认舍入生效(7.12.1),则返回正或负HUGE_VAL,HUGE_VALF或HUGE_VALL(根据返回类型和值的符号),并存储宏ERANGE的值在errno。如果结果下溢(7.12.1),则函数返回幅度为的值   不大于返回类型中最小的归一化正数;是否errno获取值ERANGE是实现定义的。