4
int
main(int argc,char **argv){

for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount) {
      argCount = 1;
      switch (argv[0][1]) {
      case 'q':
        testnum = atoi(argv[1]);
        argCount++;
        break;
      default:
        testnum = 1;
        break;
      }
    }
//...............

私の質問は、argv [0] [1]が何を意味するのか、そしてfor()の条件が私を混乱させたということです。for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount)

//みんなありがとう....**argv[0][1]はargv[0][1]でなければなりません、それはコードライターではなく私の間違いです。

4

3 に答える 3

2

そのコードは正しくないようです。**argv[0][1]a を逆参照しようとしcharます。

argv[0][1]char意味があり、「の最初の 2 番目を取る」ことを意味char*argvます。-qIMHO、コードはコマンドラインフラグを検出しようとしています(そして、その後、盲目的にそれが存在すると仮定して、次の引数testnumのバージョンに設定しintます)が、 のチェックをスキップし-、盲目的にそこにあると仮定し、他の引数はありませんq2番目のキャラクターとして持っています。

このコードはリファクタリングする必要があります。1 つの方法を次に示します。

int main(int argc, char **argv) {

    int testnum = 1;
    for (int argi = 1; argi < argc; ++argi) {
        if(argv[argi][0] == '-') {
            switch (argv[argi][1]) {
            case 'q':
                if(argi + 1 == argc || argv[argi + 1][0] == '-') {
                    /* Handle missing argument error. */
                    return 1;
                }
                testnum = atoi(argv[++argi]);
                break;
            default:
               /* Handle unrecognized flag error. */
               return 1;
            }
        }
        else
        {
            /* Handle non-flag parameter. */
        }

    /* Continue with program. */
    return 0;
}
于 2012-10-11T14:48:00.823 に答える
1

argv[0]コマンドラインで呼び出されたときのプログラムの名前を表します。と入力すると./myprogram --helpargv[0]「./myprogram」になります。

argv[0][1]上記の例では、その文字列の 2 番目の文字 '/' になります。


それを見てみましょうfor (argc--, argv++; argc > 0; argc -= argCount, argv += argCount)

argc--thenを実行してループを初期化しargv++(argvは 2 番目のユーザー パラメーター文字列を指します)、argc は引数 less を宣言します。

ループはすべての引数argc>0に対して行われ、反復ごとに、処理される引数argCountの数がすべての引数の数から取り除かれますargc。それは理にかなっている。

ただしswitch (**argv[0][1])、意味をなさないargv[0][1]は、char前に見たようにポインターではなく、逆参照できないためです。

于 2012-10-11T14:50:39.513 に答える
0

このコードは非常にクレイジーに見えます。次のことを意図していたと思います。

int main(int argc,char **argv){
 char** p = argv + 1;  // skipping program name

 while (*p != 0) {     // over all parameters
  testnum = 1;
  if (*p[1] == 'q') {  // skipping - of "-q", not a good idea
    p ++;
    if (*p != 0) {     // may be null, read testnum from parameter,
                       // ?? no check whether this is an integer at all
       testnum = atoi(*p);
    }
  }
}

(テストされていないため、コンパイルも動作もしない可能性があります)

于 2012-10-11T14:55:54.190 に答える