我想将程序参数转换为double。简单:我想将一个double值作为参数传递给我的程序。但为了使其正确,我想检测转换错误。我发现atof
不是一个好选择,所以我切换到sscanf
。继承我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
argc --;
argv++;
double s;
int handle =-1;
handle = sscanf(*argv, "%lf", &s);
if(handle == -1)
{
fprintf(stderr, "Invalid input double!\n");
}else{ printf("%f\n", s);}
return 0;
}
但输入错误,即:./code blabla
打印出0.0000000000错了?
答案 0 :(得分:2)
使用strtod
代替scanf
系列。如果无法解析数字,则返回0.0
(不幸的是,当数字实际为0.0
时)。您可以使用endptr
参数来检查函数停止解析数字的位置,以便可以用于检查字符串是否包含有效数字。当无法表示值时,它会设置errno
。
答案 1 :(得分:2)
来自Linux Programmer's Manual on scanf(3)
:
返回值
这些函数返回成功匹配和分配的输入项的数量,如果早期匹配失败,则可以少于提供的数量,甚至为零。
如果在第一次成功转换或匹配失败发生之前到达输入结尾,则返回值
EOF
。如果发生读取错误,也会返回EOF
,在这种情况下,将设置流的错误指示符(请参阅error(3)
),并设置errno
表示错误。
因此,您应该检查handle < 1
。
您也可以尝试strtod(3)
。