命令行解析器,端口号检索

时间:2013-03-02 10:52:08

标签: c parsing unix

我正在尝试为命令行输入的端口号实现一个​​简单的解析方案。我只是想知道下面的代码是否正常或有任何错误或不精确。

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)重新编辑。这应该工作。还有其他建议吗?

2 个答案:

答案 0 :(得分:2)

按照文档中的示例进行操作:http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html#Example-of-Getopt

特别是,你不是在循环中调用getopt(),而是用'?'检查“坏”选项。

答案 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);
        }
    }