繁体   English   中英

使用命令行界面减少程序的代码?

[英]Reduce code for program with command line interface?

我希望我的程序有一个如下所示的界面:

gen_data [start] [stop] [step]

[start][stop][step]是可选的,默认设置为-3*PI/23*PI/20.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; 
}

正如您所看到的,所有三个变量startstopstep每次都被分配 - 这不是多余的吗? 我大致在想这样的事情:

  • 如果 argc = 1:将所有 3 设置为默认值
  • if argc = 2: 仅将start设置为命令行 arg
  • if argc = 3:仅将startstop设置为命令行 args
  • 如果 argc = 4:设置startstopstep到命令行 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 */

注意:除非在微控制器上,否则建议使用doublestrtod()而不是float

这样,如果给出足够的 arguments,您可以选择设置stopstep ,如果没有,您将使用默认值。

在实践中避免使用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; 
}

如前所述, floatatof的使用还有很多不足之处,但这是另一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM