8

こんにちは、単純なクライアント サーバー プログラムを作成しています。このプログラムでは、getopt()次のようにポート番号と IP アドレスを取得するために使用する必要があります。

サーバー -i 127.0.0.1 -p 10001

プログラムで後で使用するために、optarg から値を取得する方法がわかりません。

4

4 に答える 4

16

while ループを使用してすべての引数を移動し、次のように処理します ...

#include <unistd.h>

int main(int argc, char *argv[])
{
    int option = -1;
    char *addr, *port;

    while ((option = getopt (argc, argv, "i:p:")) != -1)
    {
         switch (option)
         {
         case 'i':
             addr = strdup(optarg);
             break;
         case 'p':
             port = strdup(optarg);
             break;
         default:
              /* unrecognised option ... add your error condition */
              break;
         }
    }

    /* rest of program */

    return 0;
}
于 2009-12-29T09:59:35.960 に答える
4

次のようにしたらどうですか:

char buf[BUFSIZE+1];
snprintf(buf,BUFSIZE,"%s",optarg);

または、より完全な例では:

#include <stdio.h>
#include <unistd.h>

#define BUFSIZE 16

int main( int argc, char **argv )
{
    char c;
    char port[BUFSIZE+1];
    char addr[BUFSIZE+1];

    while(( c = getopt( argc, argv, "i:p:" )) != -1 )
        switch ( c )
        {
            case 'i':
                snprintf( addr, BUFSIZE, "%s", optarg );
                break;
            case 'p':
                snprintf( port, BUFSIZE, "%s", optarg );
                break;
            case '?':
                fprintf( stderr, "Unrecognized option!\n" );
                break;
        }

    return 0;
}

詳細については、Getoptのドキュメントを参照してください。

于 2009-12-29T09:46:46.043 に答える
3

これは、getopt ドキュメントの多くの欠陥の 1 つです。optarg は後で使用するためにコピーする必要があることを明確に述べていません (たとえば、strdup() を使用)。

于 2011-12-01T22:00:11.540 に答える