1
  while ((c = getopt(ac, av, "r:u:p:h:P:s:S:t:iRbo:n:")) != EOF)
        {
            switch(c)
                {
                case 'b':
                    isbsd++;
                    break;
                case 'R':
                    detectos++;
                    break;
                case 'r':
                    root = strdup(optarg);
                    break;
                case 'i':
                    is_scramble = 1;
                    break;
                case 's':
                    saddr = strtoul(optarg, 0, 0);
                    break;
                case 't':
                    timeout = strtoul(optarg, 0, 0);
                    break;
                case 'S':
                    size = strtoul(optarg, 0, 0);
                    break;
                case 'u':
                    user = strdup(optarg);
                    break;
                case 'p':
                    pass = strdup(optarg);
                    break;
                case 'h':
                    host = strdup(optarg);
                    break;
                case 'P':
                    port = strtoul(optarg, 0, 0);
                    break;
                case 'o':
                    heapbase = strtoul(optarg, 0, 0);
                    break;
                case 'n':
                    scnum = strtoul(optarg, 0, 0);
                    break;
                default:
                    usage(av[0]);
                }
        }

私は getopt 関数にまったく慣れておらず、使用したことがありません。(ac は argc、av は argv)

では、このコードはどのように動作するのでしょうか? 私が混乱しているのは、「r:u...」がどのように機能するかです。

また、このコードで strdup と strtoul は何をしますか?

ありがとう。

4

3 に答える 3

2

StackOverflow に投稿する前に、質問をよく調べてください。そうは言っても、引数を説明するgetopt の man ページがあります。optstring

optstring は、正当なオプション文字を含む文字列です。このような文字の後にコロンが続く場合、オプションには引数が必要であるため、getopt() は、同じ argv 要素内の次のテキストへのポインター、または optarg 内の次の argv 要素のテキストへのポインターを配置します。2 つのコロンは、オプションがオプションの引数を取ることを意味します。現在の argv 要素 (つまり、"-oarg" などのオプション名自体と同じ単語) にテキストがある場合、それは optarg に返されます。それ以外の場合、optarg はゼロに設定されます。これは GNU 拡張です。optstring に W とそれに続くセミコロンが含まれている場合、-W foo は長いオプション --foo として扱われます。( -W オプションは実装拡張のために POSIX.2 によって予約されています。) この動作は GNU 拡張であり、glibc 2 より前のライブラリでは利用できません。

strdup新しく割り当てられたバッファに文字列をコピーする標準 C ライブラリ関数であり (他の誰かのコピーを台無しにしないように)、strtoul文字列を unsigned long に変換します。

于 2012-09-14T09:04:22.107 に答える
1

コロン ( :) は、オプション (1 文字) の後に引数が続く必要があることを意味します。この引数は「optarg」に格納されます。

詳細については、こちらをご覧ください: http://www.gnu.org/software/libc/manual/html_node/Getopt.html

strdup()バッファを割り当て、コピー元の文字配列をコピー先にコピーする POSIX 便利な関数です。

strtoul()文字列から符号なし整数を解析し、符号なし long として返す関数です。

于 2012-09-14T09:02:25.553 に答える
0
  1. r:u:.... : 文字はコマンド ラインで指定できるフラグを表し、: は追加の引数が必要であることを示します。
  2. strdup は文字列のコピーを作成します
  3. strtoul は文字列を unsigned long に変換します
于 2012-09-14T08:58:35.913 に答える