こんにちは、単純なクライアント サーバー プログラムを作成しています。このプログラムでは、getopt()
次のようにポート番号と IP アドレスを取得するために使用する必要があります。
サーバー -i 127.0.0.1 -p 10001
プログラムで後で使用するために、optarg から値を取得する方法がわかりません。
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;
}
次のようにしたらどうですか:
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のドキュメントを参照してください。
これは、getopt ドキュメントの多くの欠陥の 1 つです。optarg は後で使用するためにコピーする必要があることを明確に述べていません (たとえば、strdup() を使用)。