2

現在、コマンド ラインから argv[] を使用して数値を取得しようとしています。言い換えれば、私はから2を達成しようとしています

./電卓 -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;}

私が間違っていることについてのアイデアはありますか?

4

4 に答える 4

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);
}
于 2013-03-04T01:54:55.323 に答える
2

argcの値をチェックして、プログラムに渡された引数の数を確認していません。引数を 2 つだけ渡すと、アクセスするargv[3]と未定義の動作が発生します。そのため、最初に引数の数を確認する必要があります。

また、値が の引数を探している場合は"-q"、次と比較し"-q"ます。

if (std::string(argv[1]) == "-q")

それを数値に変換し、初期化されていない変数と比較していますが、これは何の役にも立ちません。

于 2013-03-04T01:48:13.777 に答える
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 getoptboost::program_optionsなどのライブラリを使用したくなるでしょう。

于 2013-03-04T01:52:29.737 に答える
0

このコードには、あまり意味を成さない、または安全でも洗練されていない多くのことがあり、引数 1、3、5、および7 ですが、ここに少なくとも 1 つの問題があります。

qaの戻り値を割り当てないため、 inmainは更新されませんcheck_q。ステートメントは次のようにする必要があります。

float qa = 0;
qa = check_q(argv);

または本当に、ただ:

float qa = check_q(argv);
于 2013-03-04T01:49:24.760 に答える