我正在尝试从命令行使用argv []获取一个数字。 换句话说,我试图从
获得2./ calculator -q 2
我目前的设置是:
#include <iostream>
using namespace std;
int check_q(char* argv[]){
float q, qa;
if(atoi(argv[1]) == q){
qa = atof(argv[2]);
}
if(atoi(argv[3]) == q){
qa = atof(argv[4]);
}
if(atoi(argv[5]) == q){
qa = atof(argv[6]);
}
if(atoi(argv[7]) == q){
qa = atof(argv[8]);
}
return qa;
}
int main(int argc, char *argv[]){
float qa = 0;
check_q(argv);
cout << qa << endl;
return 0;}
关于我做错的任何想法?
答案 0 :(得分:2)
您没有检查argc
的值以查看传递给程序的参数数量。如果只传递两个参数,那么访问argv[3]
将给出未定义的行为;所以你必须先检查参数的数量。
另外,如果您正在寻找值为"-q"
的参数,请与"-q"
进行比较:
if (std::string(argv[1]) == "-q")
您正在将其转换为数字并与未初始化的变量进行比较,该变量不起作用。
答案 1 :(得分:2)
传递它:
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cassert>
float check_q(std::vector<std::string> const& args)
{
int q = 42;
for (auto it = args.begin(); it != args.end(); std::advance(it, 2))
{
if (std::stoi(*it) == q)
{
auto next = std::next(it);
assert(next != args.end());
return std::stof(*next);
}
}
return 0;
}
int main(int argc, const char *argv[])
{
const std::vector<std::string> args(argv, argv+argc);
// pass it along
check_q(args);
}
答案 2 :(得分:1)
你在这里犯了很多错误:
#include <iostream>
using namespace std;
int check_q(char* argv[])
{
float q, qa; // you never assign `q` a value, so the following comparisons make no sense
if(atoi(argv[1]) == q) // you never check argc in main to determine if argv[whatever] is valid. if the array isn't long enough, this will invoke undefined behavior.
{
qa = atof(argv[2]); // you're assigning a value to `qa` declared in this function, leaving the one declared in main unchanged. probably not what you intended
}
// and so on
return qa;
}
int main(int argc, char *argv[])
{
float qa = 0;
check_q(argv); // this function never changes the value of `qa` that's declared in main...
cout << qa << endl; // ... so this will always print 0
return 0;
}
你可能想要做更多的事情:
#include <iostream>
#include <string>
#include <vector>
float check_q(const std::vector<std::string>& args)
{
if(args[1] == "-q")
{
return ::atof(args[2].c_str());
}
else
{
return 0.0f; // or some other default
}
}
int main(int argc, char *argv[])
{
const std::vector<std::string> args(argv, argv+argc);
if(args.size() >= 3) // argv[0] is usually the name of the executable
{
std::cout << check_q(argv) << std::endl;
}
else
{
std::cout << "not enough args" << std::endl;
}
}
一旦你有了更多的经验,你就会想要使用像GNU getopt或boost::program_options这样的库。
答案 3 :(得分:0)
这段代码有很多东西没有多大意义或不安全或优雅,我不确定你要通过参数1,3的检查来实现什么, 5和7,但这里至少有一个问题:
qa
中的 main
永远不会更新,因为您没有为其分配check_q
的返回值。声明必须是:
float qa = 0;
qa = check_q(argv);
或者真的,只是:
float qa = check_q(argv);