检查终端中的参数

时间:2012-10-16 04:17:25

标签: c++ linux

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

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

./hello yes 10

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

谢谢!

3 个答案:

答案 0 :(得分:3)

命令行参数作为计数传递,argcargv参数中的单个字符串传递给main()

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

只需检查argc中的值和argv中的字符串,即可获得相应的值。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

第一个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 **他们必须遵循一个非常严格的惯例,借鉴this answer

  

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

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

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

  

第一个参数是yes或no

接下来,您必须将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;
}

我让你用数字参数来处理所有大写和小写的东西以及误报,至少我不打算所有你的作业;)