【发布时间】:2017-04-05 09:13:03
【问题描述】:
我需要检查第二个命令行参数,看看它是否是一个有效的浮点数。
#include <stdio.h>
#include <math.h>
long int fact(int n)
{
if (n >= 1)
return n*fact(n - 1);
else
return 1;
}
double func(int x0, int n)
{
int p = 2 * n + 1;
return (double)pow(x0, p) / (double)fact(p);
}
double sinh_(int x0, int N)
{
double sum = 0;
int i = 0;
for (i = 0; i <= N; i++)
{
sum = sum + func(x0, i);
}
return sum;
}
double err(int x0, int N)
{
return abs(sinh(x0) - sinh_(x0, N));
}
int main(int argc, char**argv)
{
double x0 = 0;
int N = 0;
printf("No of args %d\n", argc);
//if CLA doesn't have exactly 4 arguments passed return -1
//1st argument is app-name
//2nd argument is x0
//4th argument is N
if (argc >= 3)
{
printf("Err: no of arguments should be 2");
return -1;
}
//if the 2nd CLA is not a number, return -1
if (!isdigit(atof(argv[1])))
{
printf("1st argument must be a real value");
return -1;
}
//if the 3rd CLA is not a number, return -1
if (!isdigit(atoi(argv[2])))
{
printf("2nd argument must be an int value");
return -1;
}
x0 = atof(argv[1]);
N = atoi(argv[2]);
printf("Builtin sinh = %f", sinh(x0));
printf("Approx sinh = %f", sinh_(x0, N));
printf("Err value = %f", err(x0, N));
}
【问题讨论】:
-
使用
strtod并检查*endptr。 -
man page on GNU/Linux for strtol 有一个(相关的)扩展示例。
-
另外,
isdigit(atoi(argv[2]))是错误的。它将字符串转换为整数,然后检查该整数是否是十进制数字的代码,即 48 到 57 的值之一,假设为 ASCII。isdigit(atof(argv[1]))因类似原因不正确,但涉及double而不是int。 -
另外,检查
if (argc >= 3)不正确。应该是if (argc != 3)。
标签: c command-line