考虑以下代码:
int number;
while((w = getopt(argc, argv, "n:s:")) != -1) {
switch (w){
case 'n': {
opfile->filename = optarg;
}break;
case 's': {
number = atoi(optarg);
}break;
}
}现在,当我将两个选项或选项s留空时,例如,我使用没有命令行的args启动程序,那么number变量仍然得到一个随机值。
我在这里错过了什么?在s一案中的一些if-语句?具体来说,我想讨论的情况是,用户没有在命令行参数中为s分配特定的值/选项。
发布于 2016-08-06 03:08:55
当没有传递给程序的“选项”时,case 's'分支根本不被执行,并且没有其他任何东西将number设置为值,这意味着后续的读取触发未定义的行为。(这可能比你稍后阅读时只给你一个随机值更糟糕。这是一个必须修复的错误。)
但是,因为没有任何其他与number有关的东西,所以就足以改变
int number;至
int number = 0;或者任何你想要的默认的东西。
(顺便说一句,您应该使用strtol而不是atoi,因为atoi忽略语法错误。)
https://stackoverflow.com/questions/38800145
复制相似问题