-2

如何编写程序来检查终端中的参数是否正确?

例如,如果我有一个程序hello.cpp并且我想将其称为:

./hello yes 10

我希望程序确保第一个参数是或否,第二个参数是 1-10 之间的数字。那么如何将这些参数读入我的程序中进行检查呢?

谢谢!

4

3 回答 3

3

命令行参数作为计数和单独的字符串argc传递argvmain().

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

只需检查 in 中的值argc和字符串中argv的适当值。

于 2012-10-16T04:21:59.043 回答
3

你的意思是这样执行,./hello yes 10

c 中有一个选项 argc 和 argv,其中 argc 是传递的参数的数量,带有索引的 argv 显示传递的参数本身。

看看下面的代码迭代所有参数。

int main(int argc, char *argv[]){
    int i = 0;
    for (i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    return 0;
}
于 2012-10-16T04:24:43.080 回答
0

正如其他用户所提到的,main函数是程序的入口点,它从命令行获取数据的方式是通过它的参数。

第一个int参数是传递的所有参数的计数,包括程序名,第二个char **参数是指向每个传递的参数的指针,包括程序名:

int main
(
    int argc,       // <-- how many parameters has been provided? 
    char **argv,    // <-- what values has each parameter?
)
{
    ...
    return 0;
}

因此,知道这一点,您的电话./hello yes 10必须是这样的:

argc = 3
argv[0] = "./hello"
argv[1] = "yes"
argv[2] = "10"

名称argcargv只是一个约定,您可以随意命名它们,但最好保留每个人都使用的名称。

并且这个论点并没有被迫成为他们必须遵循一个非常严格的惯例,从这个答案int, char **中借用:

它应该有一个 int 类型的返回类型,否则它的类型是实现定义的。所有实现都应允许以下 main 定义:int main() 和 int main(int argc, char* argv[])

知道了这一点,让我们专注于您的问题:

首先,您必须确保传递了 2 个参数,因此您必须检查argc值并确保完全等于3

第一个论点是是或否

接下来,您必须将您的argv[1](因为0包含程序名称)存储到一个字符串中,并将其与值"yes"和进行比较"no"

    std::string YesOrNo(argv[1]);
    if (YesOrNo == "yes" || YesOrNo == "no")

最后,您必须将您的值存储argv[2]为一个整数并检查它是否等于或小于10

    std::stringstream Stream;
    int Value = 0;
    Stream << argv[2];
    Stream >> Value;

    if (Value <= 10)

所以,结果是:

int main(int argc, char **argv)
{
    if (argc == 3)
    {
        std::string YesOrNo(argv[1]);

        if (YesOrNo == "yes" || YesOrNo == "no")
        {
            std::stringstream Stream;
            int Value = 0;
            Stream << argv[2];
            Stream >> Value;

            if (Value <= 10)
            {
                // Your stuff..
            }
        }
    }

    return 0;
}

我让你处理所有大写和小写的东西以及带有数字参数的误报,至少我不会做你所有的功课;)

于 2012-10-16T06:42:18.733 回答