我正在尝试为命令行输入的端口号实现一个简单的解析方案。我只是想知道下面的代码是否正常或有任何错误或不精确。
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)
重新编辑。这应该工作。还有其他建议吗?
答案 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);
}
}