-2

端末の引数が正しいことを確認するプログラムを作成するにはどうすればよいですか?

たとえば、プログラムがhello.cppあり、それを次のように呼び出したいとします。

./hello yes 10

最初の引数が yes または no で、2 番目の引数が 1 ~ 10 の数字であることをプログラムに確認してもらいたいです。では、これらの引数をプログラムに読み込んでチェックを行うにはどうすればよいでしょうか?

ありがとう!

4

3 に答える 3

3

コマンド ライン引数は、argcおよびargv引数内のカウントおよび個々の文字列として に渡されmain()ます。

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

適切な値の値argcと文字列をチェックするだけです。argv

于 2012-10-16T04:21:59.043 に答える
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;
}
于 2012-10-16T04:24:43.080 に答える
0

他のユーザーが述べたように、main関数はプログラムのエントリ ポイントであり、コマンド ラインからデータを取得する方法はパラメータを使用することです。

最初のint引数は、プログラム名を含む、渡されたすべての引数の数です。2 番目の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 **から借りた、非常に厳格な規則に従わなければならないという議論は強制されません:

型 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;
}

大文字と小文字、および数値引数の誤検知はすべてあなたに任せます。少なくとも、私はあなたのすべての宿題をするつもりはありません ;)

于 2012-10-16T06:42:18.733 に答える