-2

次のコマンドを解析するには、getopt を使用する必要があります。

./center -n name –cp Anumber –i Anumber –t Anumber –s Anumber -fc nameOfaFile

それらはすべて任意の順序で発行できます。

したがって、getOpt を使用する必要があることは明らかです。

だから私は調査してきました、これは私がこれまでに持っているものです

 void check_parameters (int argc, char** argv) {
    int opt; 

    while((opt = getopt(argc, argv, "n:cp:i:c:fc:")) != -1) {
       printf("give me opt %c \n", opt)
       swicth(opt){
          case 'n' :
             //do something
          case 'cp' :
             //do something
          case 'i' :
            //do something
       }
    }
  }

私は事実を知っています 3 パラメータ: OptString は、getOpt に期待するオプションの文字を伝える場所です また、optarg では、引数がどこにあるかを示します

動いていない!printf( "give me opt %c", opt ) すると、文字ではなく数字が表示されます。

このため、機能しません。パラメータを正しくチェックしません

編集: man 3 getopt を実行した後の getopt の戻り値は次のとおりです。オプションが正常に見つかった場合、 getopt() はオプション文字を返します。すべてのコマンド行オプションが解析された場合、getopt() は -1 を返します。
オプション文字を返しますか?常に整数 1 を返します。getopt の仕組みがわかりません。スイッチはキャラクターと比べてどうですか?

4

2 に答える 2

4

まず第一に、これ:

case 'cp':

...意味がありません。charまたはで 2 つの文字を表すことはできませんint。さらに、プログラムを で実行すると-cp 101、getopt はそれを として扱い-c p 101、まったく異なる結果になります。長いオプションを使用したい場合は、getopt_long代わりに適切な呼び出し構文を使用してください./a.out -n 42 --cp 101

さて、ここに実際の動作例がgetopt()あります:

#include <stdio.h>
#include <getopt.h>

int main(int argc, char* argv[]) {
  int opt;

  while((opt = getopt(argc, argv, "n:cp:i:c:fc:")) != -1) {
    switch (opt){
      case 'n':
        printf("n was %s\n", optarg);
        break;

      case 'i':
        printf("i was %s\n", optarg);
        break;
    }
  }
  return 0;
}
于 2013-01-31T20:48:48.403 に答える
2

getopt-cporのようなものではなく、1 文字のオプション名のみを処理します-fc(1 つの文字列内の複数のオプション フラグとして解釈されます: -c -p, -f -c)。定義した構文に固執したい場合は、独自の構文を作成する方が簡単です。

// first check whether argc is odd, then:
for (i = 1; i < argc; i += 2) {
    if (strcmp(argv[i], "n") == 0) {
        name = argv[i+1];
    } else if (strcmp(argv[i], "cp") == 0) {
        // etc. etc.
    }
}
于 2013-01-31T20:45:27.910 に答える