字符串转换为数字的问题(strtod)

时间:2011-04-07 12:25:52

标签: c linux string double strtod

我使用strtod()函数将环境变量提取为字符串,然后使用strtod将其更改为double:

enter code here
 char strEnv[32];
 strncpy(strEnv, getenv("LT_LEAK_START"), 31);
 // How to make sure before parsing that env LT_LEAK_START is indeed a number?
 double d = strtod(strEnv, NULL);

现在我想确保用户输入的这个数字是一个数字而不是字符串或特殊字符。我怎样才能确定?

代码段会有很大的帮助。

提前致谢。

6 个答案:

答案 0 :(得分:15)

strtod函数的第二个参数很有用。

char *err;
d = strtod(userinput, &err);
if (*err == 0) { /* very probably ok */ }
if (!isspace((unsigned char)*err)) { /* error */ }

编辑:添加了示例

strtod函数尝试将第一个参数的初始部分转换为double,并在没有更多字符时停止,或者有一个不能用于生成double的char。 / p>

input         result
----------    ----------------------------
"42foo"       will return 42
              and leave err pointing to the "foo" (*err == 'f')

"     4.5"    will return 4.5
              and leave err pointing to the empty string (*err == 0)

"42         " will return 42
              and leave `err` pointing to the spaces (*err == ' ')

答案 1 :(得分:3)

当然,你可以做的不仅仅是阅读strtod()的手册页并采取行动。例如。在我的Linux系统上它说:

RETURN VALUE
       These functions return the converted value, if any.

       If  endptr  is  not  NULL,  a pointer to the character after the last character used in the conversion is stored in the location referenced by
       endptr.

       If no conversion is performed, zero is returned and the value of nptr is stored in the location referenced by endptr.

       If the correct value would cause overflow, plus or minus HUGE_VAL (HUGE_VALF, HUGE_VALL) is returned (according to the sign of the value), and
       ERANGE is stored in errno.  If the correct value would cause underflow, zero is returned and ERANGE is stored in errno.

这几乎告诉你为了处理错误你需要做些什么。另外,就像Johann Gerell所说,你还需要检查getenv()是否成功;类似的方法在那里工作,即检查手册页并根据它编写错误处理代码。

答案 2 :(得分:2)

man strtod:如果没有执行转换,则返回零,并且nptr的值存储在endptr引用的位置。

char * endptr;
double d = strtod(strEnv, &endptr);
if (strEnv == endptr)
   /* invalid number */
else
   ...

答案 3 :(得分:1)

  • 首先,检查getenv的返回值 - 如果它为NULL,则该环境变量不存在。
  • 其次,如果getenv的返回值不为NULL,则您将该值作为字符串。
  • 第三,不要将char ** endptr的{​​{1}}参数设置为NULL,而是使用它来检查转换后的值的有效性,同时检查strtod

答案 4 :(得分:0)

strtod的第二个参数,你设置为NULL,可以是一个指向char的指针;它指向的指针指针将设置为最后一个strtod设法解析后的字符。如果这是字符串的结尾,或者至少在它之后没有什么,只有空格,那么你所拥有的是一个数字。否则,它就是其他东西。

答案 5 :(得分:0)

我对这种语言知之甚少,但我知道如果输入错误,strtod()将返回0.0。也许您可以使用正则表达式来验证输入字符串是否为数字。