0

私のコマンドラインはa.out -a 3eF6

argv [2]にアクセスすると、3eF6(これはcharの配列だと思いますか?)を取得します。これをループして、すべてのcharが整数であり、「e」のようなアルファ値ではないことを確認するにはどうすればよいですか。または「F」?

どのように/私はそれを文字列に変えるでしょうか?

私がそうする場合a = atoi(argv[2])、ここargv[2]で32、次にa = 32であることを知っています。また、argv[2]が3eF6の場合、次の結果が「間違った入力」にならないことも知っています。

 a = 0;
 a = atoi(argv[2])
if( a = 0 )
 cout << "wrong input";

代わりに、a3と評価されます。したがって、このインスタンスでは最初の整数のみが読み取られますが、引数3eF6全体にアクセスできるようにしたいと思います。

atoi(getline(argv [2]、a)などを使用してみましたが、何らかの理由で文字列をconstcharに変換できないというエラーが表示されます。

とにかく、argv [2]を解析可能な文字列に変換するにはどうすればよいですか?または、argv [2]の各文字にアクセスするにはどうすればよいですか?

私も試しました:

string string1 = argv[i+1] // argv[i] is an option like -a

しかし、引数を指定してプログラムを実行すると、次のエラーが発生します。

./a.out -b 2 -a 2 -s 2 -t 8

'std :: logic_error'のインスタンスをスローした後に呼び出された終了what():basic_string :: _ S_construct NULLが無効です中止(コアダンプ)

4

2 に答える 2

1

最後に、char コマンド ライン要素を保持する char ポインターを作成しました。

char* charString = argv[i+1];

それを関数に渡して解析します

parser(charString);

この場合、argv[i+1] は私の質問の argv[2] と同等です。私のパーサー関数の関数定義は次のようになります。

    void parser(char* charString){
        for(int i=0; charString[i] != '\0'; i++){
                bool isAlpha = isalpha(charString[i]);
                bool isPunct = ispunct(charString[i]);
                if ((isAlpha == true)||(isPunct == true)){
                        printError();
                        exit(1);
                } else;
           }
     }

注意すべき重要なことは、char 配列の最後で解析を終了することはできないということです。

for(int i=0; charString[i] < sizeof(charString); i++){

配列サイズは常に 8 または 9 を返すため、代わりに、評価された文字が '\0' に等しい場合に解析を終了する必要があります。つまり、文字 charString[i] が '\0' に等しくない場合に解析を行う必要があります。

于 2013-03-03T22:27:28.777 に答える
1
TCHAR c;
int n(0);
int x(0);
int y(0);

for (x = 0; x < argc; ++x)
{
    // Loop through each character in the argument.
    n = _tcslen(argv[x]);
    for (y = 0; y < n; ++y)
    {
        c = argv[x][y];
        if (isdigit(c))
        {
            cout << c << "is a digit" << endl;
        }
        else
        {
            cout << c << "is not a digit" << endl;
        }
    }
}
于 2013-03-03T04:46:56.120 に答える