我写了一个简单的程序来计算三角形的斜边长度。我的问题是,我怎样才能给出变量"侧面1";以及";侧面2";从终端执行主功能时的值?以下代码:
#include <iostream>
#include <cmath>
int main(int side1, int side2) {
int c2 = (pow(side1, 2)) + (pow(side2, 2));
std::cout << sqrt(c2) << std::endl;
return 0;
}
该函数编译时没有错误,所以通常我会使用"从终端执行该函数/main.exe";,但是有没有一种方法可以将值传递给变量side1&执行时side2?(例如./main.exe"5"5"(。我不想走std::cin路线,因为我已经知道怎么做了。出于同样的原因,我不想给函数中的变量赋值(例如:int side1{5};(。
我不知道这是否可行,但像Leetcode这样的网站的功能是这样设置的,我不知道他们是如何为测试用例输入值的。
主函数的签名可以是
int main(int argc, char *argv[])
所以你得到一个论点计数和一个";字符串";大堆请注意,argv[0]
是可执行文件名,因此side1
将是argv[1]
,side2
将是argv[2]
。
您需要获取命令行参数字符串并将其转换为整数。遗憾的是,如果您想捕捉错误,这确实会稍微增加程序的复杂性。
#include <cmath>
#include <iostream>
#include <string>
int help()
{
std::cerr <<
"usage:n"
" a.exe SIDE1 SIDE2nn"
"Where SIDE1 and SIDE2 are integers.n";
return 1;
}
int main( int argc, char ** argv )
{
int side1, side2;
if (argc != 3) return help();
try {
side1 = std::stoi( argv[1] );
side2 = std::stoi( argv[2] );
}
catch (...)
{
return help();
}
int c2 = side1*side1 + side2*side2;
std::cout << std::sqrt( c2 ) << "n";
}
你可以留下很多错误检查,让程序崩溃而不做解释,但IMHO总是值得在你的程序中添加一个用法子句,以帮助用户(包括两个月后的你自己(找出如何运行程序。
如前所述,main
的函数签名不正确。当您想要访问命令行参数时,正确的签名是:
int main(int argc, char **argv)
argc
是参数的计数,第一个是可执行文件的名称。argv
就是这些参数的数组。我们可以:
- 检查是否传入了正确数量的参数,如果没有,则打印错误
- 使用
std::atoi
将这些输入转换为int,此时我们可以随心所欲地使用它们
#include <iostream>
#include <cstdlib>
int main(int argc, char **argv) {
if (argc != 3) {
std::cerr << "Usage: "<< argv[0]
<< " val1 val2" << std::endl;
return 1;
}
auto v1 = std::atoi(argv[1]);
auto v2 = std::atoi(argv[2]);
std::cout << v1 << ", " << v2 << std::endl;
return 0;
}
您的main
签名错误。看见https://en.cppreference.com/w/cpp/language/main_function.