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

另一种方法是使用 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 回答