命令行参数

Command Line Argument

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

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]);
    }
}

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

Hello, Mr. last_name

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

我卡住的部分是当给出的命令行参数是 == 3 时。如果给出 3 个参数,那么终端应该打印出...

Hi, Mr. last_name, your test score is test_score

...或...

My name is first_name last_name.

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

My name is Smith 3.4

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

My name is John Smith.

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

你的问题出在这一行:

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 != '[=12=]')
        {
            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]);
    }
}

我没有测试代码,可能有更好的方法来检查命令行中的参数是否为 "numeric"。

I do not want the answer, I just want what I am doing wrong and hints on how to fix it.

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

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

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

伙计们,知道答案了。要在不使用其他功能的情况下检查它,它将是

.....

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);
}

...