3

根据 MSDN:

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

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

OK,我用下面的代码来验证一下思路:

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。任何想法?

4

2 回答 2

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'

于 2015-01-15T22:06:39.617 回答
2

签名是(给或取restrict关键字):

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

如果你传递一个非空指针作为第二个参数,它将返回nptrif 它不能执行任何转换的值。如果它在输入字符串中找到一个真正的零,那么存储在其中的值*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 是实现定义的。

于 2015-01-15T22:05:20.517 回答