0

コマンドラインから入力されたポート番号の単純な解析スキームを実装しようとしています。以下のこのコードで問題がないのか、エラーや不正確な点があるのか​​、疑問に思っています。

void main(int argc, char *argv[]){
int sock_ds, opt;
char *cmd_port;
unsigned short port;


/*Parsing command line: port-number retrieving*/
while (( opt = getopt(argc, argv, "p:")) != -1){
    switch(opt){
        case 'p':
            port = (unsigned short) strtoul(optarg, &optarg, 0); //string to unsigned long integer with ushort cast
            if(*optarg){
                fprintf(stderr, "String-integer conversion error\n");
                exit(EXIT_FAILURE);
            }
            break;
        default: /* '?' */
        fprintf(stderr, "Usage: %s -p port_number\n", argv[0]);
        exit(EXIT_FAILURE);
    }

}

printf("Port number retrieved (%d), server is starting ...\n", port);
    /* ... */
}

ご協力ありがとうございました!

ループで再編集しgetopt(3)ます。これは機能するはずです。他に提案はありますか?

4

2 に答える 2

2

ドキュメントの例に従ってください:http ://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html#Example-of-Getopt

特に、ループ内でgetopt()を呼び出しておらず、「?」を使用して「不正な」オプションをチェックしていません。

于 2013-03-02T12:39:16.907 に答える
1

もう1つの方法は、sscanf()を使用して、その戻り値(:=割り当ての数)を確認することです。

unsigned short port;
int opt;
opt = getopt(argc, argv, "p:");
if(opt == 'p'){
    int rc;
    rc = sscanf( optarg, "%hu", &port);
    if (rc < 1){
        fprintf(stderr, "String-integer conversion error for %s\n", optarg);
        exit(EXIT_FAILURE);
        }
    }
于 2013-03-02T12:44:54.440 に答える