如何编写程序来检查终端中的参数是否正确?
例如,如果我有一个程序hello.cpp
,我想将其称为:
./hello yes 10
我希望程序确保第一个参数是yes或no,第二个参数是1-10之间的数字。那么如何将这些参数读入我的程序来进行检查呢?
谢谢!
答案 0 :(得分:3)
命令行参数作为计数传递,argc
和argv
参数中的单个字符串传递给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"
名称argc
和argv
只是一种惯例,您可以随意命名,但保留每个人都使用的名称是一种很好的做法。
并且这个论点不会被强迫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;
}
我让你用数字参数来处理所有大写和小写的东西以及误报,至少我不打算所有你的作业;)