7

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

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);

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

一个代码片段会很有帮助。

提前致谢。

4

6 回答 6

16

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

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

编辑:添加示例

strtod函数尝试将第一个参数的初始部分转换为双精度,并在没有更多字符时停止,或者有一个不能用于创建双精度的字符。

输入结果
---------- ----------------
"42foo" 将返回 42
              并让 err 指向 "foo" (*err == 'f')

“ 4.5” 将返回 4.5
              并让 err 指向空字符串 (*err == 0)

“42”将返回 42
              并让 `err` 指向空格 (*err == ' ')
于 2011-04-07T12:32:31.990 回答
3

man strtod: 如果不进行转换,则返回零,并将 nptr 的值存储在 endptr 引用的位置。

char * endptr;
double d = strtod(strEnv, &endptr);
if (strEnv == endptr)
   /* invalid number */
else
   ...
于 2011-04-07T12:34:28.590 回答
2

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

返回值
       这些函数返回转换后的值(如果有)。

       如果 endptr 不为 NULL,则指向转换中使用的最后一个字符之后的字符的指针存储在由
       结束点。

       如果不执行转换,则返回零并将 nptr 的值存储在 endptr 引用的位置。

       如果正确的值会导致溢出,则返回正负 HUGE_VAL (HUGE_VALF, HUGE_VALL)(根据值的符号),并且
       ERANGE 存储在 errno 中。如果正确的值会导致下溢,则返回零并将 ERANGE 存储在 errno 中。

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

于 2011-04-07T12:48:34.480 回答
1
  • 首先,检查 - 的返回值,getenv如果它为 NULL,则该环境变量不存在。
  • 其次,如果 的返回值getenv不是 NULL,那么您将拥有该值,作为一个字符串。
  • 第三,不要将 的char ** endptr参数设置strtod为 NULL,而是用它来检查转换后的值的有效性,还要检查0.0.
于 2011-04-07T12:34:44.773 回答
0

strtod您设置为的第二个参数NULL可以是指向字符的指针;它指向的指向字符的指针将在最后一个strtod成功解析后设置为字符。如果这是字符串的结尾,或者至少在它之后除了空格之外什么都没有,那么你所拥有的是一个数字。否则,那就是另外一回事了。

于 2011-04-07T12:32:01.367 回答
0

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

于 2011-04-07T12:33:07.857 回答