C语言getopt解析参数时合法选项分支optopt为0是何原因
问题根因
你对getopt配套全局变量optopt的作用理解存在偏差,这是导致问题的直接原因:
optopt的设计用途仅用于存储解析出错时的问题选项字符:只有当getopt遇到未在选项字符串中定义的非法选项、或者选项缺少必填参数时,才会将触发错误的选项字符写入optopt;当选项被正常识别匹配时,optopt不会被更新,会保持初始值0,这就是你在case 'f'分支中读取到0的原因。- 当
getopt正常匹配到合法选项时,对应的选项字符会直接作为函数返回值赋值给你定义的opt变量,不需要从optopt中读取。 - 你在
case '?'分支能正常读到optopt的值,是因为进入这个分支本身就代表getopt触发了解析错误,此时optopt已经被正确赋值为出错的选项字符,符合该变量的设计使用场景。
修复方法
将case 'f'分支中打印提示时用到的optopt替换为存储当前匹配选项的opt变量即可,修正后的对应代码段如下:
case 'f':{ if(conf->socketname[0] == '\0'){ strncpy(conf->socketname, optarg, strlen(optarg)); } else printf("Option %c have to been used one time\n", opt); break; }
额外提示:你当前代码中
strncpy的写法存在缓冲区溢出风险,strncpy需要手动指定目标缓冲区的最大长度,而不是直接传入源字符串长度,使用时需要额外注意。
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

