0

-f の後のオプション/引数が 0 から 9 の間の数値であることを確認したいと思います。任意の順序で、合計 10 個の引数が必要です。唯一の条件は、-f の後に数字が続く必要があることです。

/* Ensure that the -f option is included in the arguments
and it is preceeded by valid digit between 0 -9 */
int Crypto::offsetValidation( int argc, char *argv[] )
{
    for( int i = 0; i < argc; i++ )
    {
        if(argv[i] == string("-f"))             
        {           
            cout << "offset" << endl;           
            return offset;
        }       
    }   

    cout << "Usage: -f is required for offset" << endl;
    exit(EXIT_FAILURE);

    return 0;   
}
4

1 に答える 1

1

コメントを回答に転記する

を使用getopt() し、それが指しているものoptargが 1 桁の数字 ( strlen(optarg) == 1 && isdigit(optarg[0])) であることを確認します。アドホックな引数の解析は、あらゆる種類のアドホックな問題を引き起こします。

ただし、「 -f 」オプションの直後にあることを確認するにはどうすればよいですか...</p>

次のようなコードを記述できます。

int opt;
while ((opt = getopt(argc, argv, "f:")) != -1)
{
    switch (opt)
    {
    case 'f':
        if (strlen(optarg) == 1 && isdigit(optarg[0]))
            f_value = optarg[0] - '0';
        else
            err_exit("Invalid value '%s' for -f option", optarg);
        break;
    default:
        …usage error and exit…;
        break;
    }
}

持っていることを保証することはできません-f3が、元の文字列の比較ではそれが許可されませんでした。を使用すると、コマンド ラインでまたはを使用しgetopt()ている場合、 . 私はあなたが引数しか持っていないと仮定しています。他のものを処理するには、それらが何であれ、より多くのコードが必要になります。現在含まれている文字列に追加のオプション文字を追加し、スイッチに追加のケースとそれらを処理する変数を追加する必要があります。-f3-f 3strcmp(optarg, "3") == 0-f"f:"

また、これは「本物の C++」ではなく C++ でコンパイルできる C コードであることも付け加えておきます。プロジェクトで Boost の使用が許可されている場合は、C++ でオプションを解析するためのBoostライブラリがより適切な選択になる可能性があります。一般に、他にも多くのオプション パーサーがあります。GNUは、長いオプション名の解析 (など)getopt_long()にも広く使用されています。--file name-of-file

于 2014-10-09T05:38:06.427 に答える