命令行参数

时间:2016-04-15 02:42:19

标签: c command-line-arguments

我无法弄清楚如何使这段代码工作。假设是依赖于命令行给出的参数,它假设打印出问候语。

int main (int argc, char *argv[]) {

double testscore;

    if (argc == 2) {
        printf("Hello, Mr.%s.\n", argv[1]);

    }
    else if (argc == 3 && argc == testscore) {
        testscore = atof(argv[2]);
        printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore);
    }
    else  {

        printf("My name is %s %s.\n", argv[1], argv[2]);
    }
}

如果有人只输了他们的姓氏,那么终端会打印出来......

  

你好,last_name先生

...因为他们只提出了一个论点。这很好。

我被困的部分是给出的命令行参数是== 3。如果给出3个参数,则终端要么打印出来......

  

嗨,last_name先生,你的考试成绩是test_score

...或...

  

我的名字是first_name last_name。

如果我在命令行参数中只输入姓氏和测试分数(Smith 3.4),那么它会打印出来(例如使用姓氏Smith)然后打印出来......

  

我的名字是Smith 3.4

但是,它确实适用于输入名字和姓氏(John Smith)。这给了......

  

我的名字是John Smith。

我不想要答案,我只想知道我做错了什么,并提示如何修复它。

3 个答案:

答案 0 :(得分:3)

  

我不想要答案,我只想知道自己做错了什么,并提示如何解决问题。

问题1:您在初始化之前使用testscore变量。

问题2:您没有使用atof执行错误处理。我建议使用strtod()。您可以使用它执行一些错误处理,以了解第三个参数是否为浮点数。您还可以创建自己的atof()实现,如果有的话,它将转换并报告转换错误。

提示:尝试首先检查传递给c程序的参数数量。之后,尝试使用strtod()或您自己的实现将第三个参数转换为float。如果成功转换,请将float convrsion的结果分配给test_score并打印last_nametestscore。如果没有,则将第三个参数视为last_name并打印first_namelast_name

答案 1 :(得分:2)

你的问题在于这一行:

else if (argc == 3 && argc == testscore) {

实际上,当argc == 3时,你想检查argv [2]是否是一个数字参数。

else if ( (argc==3) && (is_numeric_arg(argv[2])==1)) {

可能的实施方式是:

int is_numeric_arg(char* arg)
    {
        int isInt = 0;
        int isFloat = 0;
        int isChar = 0;
        char* currChar;
        int i = 0;
        currChar = arg;
        isInt = 1;
        while (*currChar != '\0')
        {
            if(*currChar < '0' || *currChar > '9')
            {
                if(*currChar == '.' && isInt == 1)
                {
                    isInt = 0;
                    isFloat = 1;
                }
                else
                {
                    isInt = 0;
                    isChar = 1;
                }
            }
            currChar++;
        }
        if (isChar == 1){ return 0; } // argument is a string
        else { return 1; } // argument is a int or float
    }

int main (int argc, char *argv[]) {

    double testscore;

    if (argc == 2) {
        printf("Hello, Mr.%s.\n", argv[1]);

    }
    else if ( (argc==3) && (is_numeric_arg(argv[2])==1)) {
        testscore = atof(argv[2]);
        printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore);
    }
    else  {

        printf("My name is %s %s.\n", argv[1], argv[2]);
    }
}

我没有测试代码,可能有更好的方法来检查命令行中的参数是&#34;数字&#34;。

答案 2 :(得分:0)

得到答案的人。要在不使用其他功能的情况下进行检查,它将是

...

else if ( argc==3 && sscanf(argv[2], "%f", testscore) 


{


    testscore = atof(argv[2]);

    printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore);
}

...