[英]Reduce code for program with command line interface?
我希望我的程序有一个如下所示的界面:
gen_data [start] [stop] [step]
[start]
、 [stop]
和[step]
是可选的,默认设置为-3*PI/2
、 3*PI/2
和0.01
。 我有以下代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define PI 3.14569
int main (int argc, char **argv)
{
float i, start, stop, step;
printf ("# gnuplot data\n"
"# x sin(x) cos(x)\n");
switch (argc) {
case 1:
start = -(3*PI)/2;
stop = (3*PI)/2;
step = 0.01;
break;
case 2:
start = atof (argv[1]);
stop = (3*PI)/2;
step = 0.01;
break;
case 3:
start = atof (argv[1]);
stop = atof (argv[2]);
step = 0.01;
break;
case 4:
start = atof (argv[1]);
stop = atof (argv[2]);
step = atof (argv[3]);
break;
}
for (i = start; i <= stop; i += step)
printf ("%6f\t%6f\t%6f\n", i, sin (i), cos (i));
return 0;
}
正如您所看到的,所有三个变量start
、 stop
和step
每次都被分配 - 这不是多余的吗? 我大致在想这样的事情:
start
设置为命令行 argstart
和stop
设置为命令行 argsstart
、 stop
和step
到命令行 args 我使用switch
的原因 - case
是为了能够利用失败 - 但无法让它工作。 有什么想法吗? 代码是否正常?
使用三元组真的很容易。 你可以简单地做:
if (argc < 2) {
fputs ("error: insufficient arguments\n"
"usage: ./program start [stop] [step]\n", stderr);
return 1;
}
char *endptr;
float start = strtof (argv[1], &endptr), /* validation omitted */
stop = argc > 2 ? strtof (argv[2], &endptr) : -3*PI/2.,
step = argc > 3 ? strtof (argv[3], &endptr) : 3*PI/2.;
/* rest of code */
(注意:除非在微控制器上,否则建议使用double
和strtod()
而不是float
)
这样,如果给出足够的 arguments,您可以选择设置stop
和step
,如果没有,您将使用默认值。
在实践中避免使用atoi()
、 atof()
,它们提供零错误检测,并且在发生故障时不提供任何指示。 atof()
将愉快地接受atof("my cow");
并且在你不知道的情况下默默地返回0
。
如果您还有其他问题,请仔细查看并告诉我。
您可以先为所有变量设置默认值。 然后不根据argc
的相等性设置它们,而是通过>
例如
#include <stdlib.h>
#include <stdio.h>
int main (int argc, char **argv)
{
float start = -(3*PI)/2;
float stop (3*PI)/2;
float step = 0.01;
printf ("# gnuplot data\n"
"# x sin(x) cos(x)\n");
if (argc > 1)
start = atof (argv[1]);
if (argc > 2)
stop = atof (argv[2]);
if (argc > 3)
step = atof (argv[3]);
for (float i = start; i <= stop; i += step)
printf ("%6f\t%6f\t%6f\n", i, sin (i), cos (i));
return 0;
}
如前所述, float
和atof
的使用还有很多不足之处,但这是另一个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.