C getopt忽略命令行参数

C getopt忽略命令行参数,c,getopt,C,Getopt,我有以下代码: char *host = NULL; int port = 53; int opt; while ((opt = getopt(argc, argv, "s:p:f:")) != -1) { switch (opt) { case 's': host = optarg; if (!isValidIpAddress(host)) { struct hoste

我有以下代码:

char *host = NULL;
int port = 53;
int opt;

while ((opt = getopt(argc, argv, "s:p:f:")) != -1) {
    switch (opt) {
        case 's':
            host = optarg;
            if (!isValidIpAddress(host)) {
                struct hostent *host_info = gethostbyname(host);
                if (host_info == NULL) {
                    fprintf(stderr, "Domain not found!\n");
                    return 1;
                }
                struct in_addr **address_list = (struct in_addr **)host_info->h_addr_list;
                strcpy(host, inet_ntoa(*address_list[0]));
            }
            break;
        case 'p':
            port = atoi(optarg);
            if (port < 1 || port > 65535) {
                fprintf(stderr, "Invalid port number!\n");
                return 1;
            }
            break;
        case 'f':
            // does nothing at the moment
            break;
        default:
            printf("Option incorrect\n");
            return 1;
        }
}
char*host=NULL;
int端口=53;
int-opt;
while((opt=getopt(argc,argv,“s:p:f:”)!=-1){
开关(opt){
案例s:
主机=optarg;
如果(!isValidIP地址(主机)){
结构hostent*host_info=gethostbyname(主机);
如果(主机信息==NULL){
fprintf(stderr,“未找到域!\n”);
返回1;
}
地址中的结构**地址列表=(地址中的结构**)主机信息->地址列表;
strcpy(主机,inet_ntoa(*地址列表[0]);
}
打破
案例“p”:
端口=atoi(optarg);
如果(端口<1 | |端口>65535){
fprintf(stderr,“无效端口号!\n”);
返回1;
}
打破
案例“f”:
//现在什么都不做
打破
违约:
printf(“选项不正确\n”);
返回1;
}
}
当我使用
/test-sgoogle.com-p40运行这个函数时,getopt()处理-s参数,但似乎忽略了-p(在第一个循环后返回-1)

编辑:它忽略-s之后的每个参数

我确信问题非常简单,一旦有人指出,我会觉得自己很笨,但我就是想不出来

提前感谢。

将评论转换为答案


您应该将您的
//省略的
注释替换为
printf(“找到的:%c'%s'\n',opt,optarg”)以便您和我们能够看到被发现的内容。可能是您遗漏的代码造成了麻烦-这些事情已经知道了。请阅读有关如何创建MCVE(-或MRE或现在使用的任何名称)或SSCCE()的内容

使用提供的额外代码


您的问题可能是行
strcpy(主机,inet\u ntoa(*address\u list[0])。因为您在参数列表中将
host
设置为指向
optarg
点的位置,并且
optarg
在参数列表中指向
asd
,并且扩展的主机名比
asd
长,所以您的代码在参数列表上乱涂乱画,使所有内容(尤其是
getopt()
)陷入混乱

…这一点得到了以下方面的证实:

你说得对,就是这样

将评论转换为答案


您应该将您的
//省略的
注释替换为
printf(“找到的:%c'%s'\n',opt,optarg”)以便您和我们能够看到被发现的内容。可能是您遗漏的代码造成了麻烦-这些事情已经知道了。请阅读有关如何创建MCVE(-或MRE或现在使用的任何名称)或SSCCE()的内容

使用提供的额外代码


您的问题可能是行
strcpy(主机,inet\u ntoa(*address\u list[0])。因为您在参数列表中将
host
设置为指向
optarg
点的位置,并且
optarg
在参数列表中指向
asd
,并且扩展的主机名比
asd
长,所以您的代码在参数列表上乱涂乱画,使所有内容(尤其是
getopt()
)陷入混乱

…这一点得到了以下方面的证实:

你说得对,就是这样


您是否在
s
p
的省略代码中使用
optarg
?是否有意在
p
的代码之后没有
中断
?您应该用
printf替换
//省略的
注释(“发现:%c'%s'\n',opt,optarg”)以便您和我们能够看到被发现的内容。可能是您遗漏的代码造成了麻烦-这些事情已经知道了。请阅读有关如何创建MCVE(-或MRE或现在使用的任何名称)或SSCCE()。添加调试打印并在片段周围包装最小代码,我无法重现您的问题。这表明问题出在您没有显示的代码中。请按照之前的要求创建MCVE。@MihaiMaruseac是的,我是。丢失的中断不是故意的,但并不能解决问题。您的问题可能是行
strcpy(主机,inet\u ntoa(*address\u list[0])。因为您在参数列表中将
host
设置为指向
optarg
点的位置,并且
optarg
在参数列表中指向
asd
,并且扩展的主机名比
asd
长,所以您的代码在参数列表上乱涂乱画,尤其是
getopt()
)您是否在
s
p
的省略代码中使用了
optarg
?是否有意在
p
的代码之后没有
中断
?您应该用
printf替换
//省略的
注释(“发现:%c'%s'\n',opt,optarg”)以便您和我们能够看到被发现的内容。可能是您遗漏的代码造成了麻烦-这些事情已经知道了。请阅读有关如何创建MCVE(-或MRE或现在使用的任何名称)或SSCCE()。添加调试打印并在片段周围包装最小代码,我无法重现您的问题。这表明问题出在您没有显示的代码中。请按照之前的要求创建MCVE。@MihaiMaruseac是的,我是。丢失的中断不是故意的,但并不能解决问题。您的问题可能是行
strcpy(主机,inet\u ntoa(*address\u list[0])。因为您在参数列表中将
host
设置为指向
optarg
点的位置,并且
optarg
在参数列表中指向
asd
,并且扩展的主机名比
asd
长,所以您的代码在参数列表上乱涂乱画,使所有内容(尤其是
getopt()
)陷入混乱。