c - 开关盒不影响变量 C
问题描述
int main (int argc, char **argv) {
//Initialise variable for switch option
int option = 0;
//Set time to default to epoch
char *argtime = "1970-01-01 00:00:00";
//Use getopt to parse switches t and h (neither requires an argument, as epoch is defaulted to if non is supplied)
while ((option = getopt(argc, argv, "th")) != -1) {
//Switch statements for supplied switches
switch (option) {
//If -t
case 't':
//If arg supplied
if(optarg != NULL) {
//Set arg to given arg
argtime = optarg;
}
printf("-t is selected.\n");
break;
//If -h
case 'h':
printf("Help is selected\n");
break;
//If anything else
default:
printf("Option invalid\n");
return 1;
}
}
printf("The set time is %s\n", argtime);
return 0;
}
这是我编写的一些代码,用于使用 getopt() 来解析命令行开关和参数。如果没有提供参数,我希望它argtime
默认为“1970-01-01 00:00:00”,但当我使用-t
开关并提供不同的参数时,argtime 不受影响。所以基本上argtime = optarg;
没有做它应该做的,但我不知道为什么。
解决方案
您需要getopt()
说明需要参数的选项。正如@xing 在评论中所描述的那样,您可以通过在选项字符串中,在受影响的选项字母之后放置一个冒号来做到这一点。这允许getopt()
正确处理分组选项并识别非选项参数。只有这样做,您才能期望通过optarg
.
您在评论中声称想要一个可选的选项参数。POSIX 标准getopt()
没有提供这一点。在您的特定情况下,尚不清楚您为什么甚至想要它,因为指定-t
没有参数的选项意味着什么?那程序应该使用默认值吗?但这就是如果-t
完全省略它会做的事情。
尽管如此,使用 POSIX 处理这种情况的方法getopt()
是提供两个单独的选项,一个带参数,一个不带参数。例如,您可以使用 option-T
来表示您想要的任何内容,-t
而无需使用表示 ( getopt(argc, argv, "t:Th")
) 的选项。或者,如果您愿意依赖 GNU 扩展,那么您可以通过双冒号 ( getopt(argc, argv, "t::h")
) 表示可选的选项参数,但这不太便携,并且语义略有不同。
推荐阅读
- angular8 - 在服务器给出的角度 8 中设置 href 字符串
- python-3.x - 如何从“旧式”类实现“新式”Python AsyncIO 迭代器函数?
- ios - 无法在 Swift 中使用来自 Firebase 的数据立即加载 UIImageView 和 UILabel
- python - 你如何删除编码的字符
- javascript - React/Redux 变量在生产中返回 HTML
- r - R从先知的每周季节性分析中删除周六和周日
- batch-file - 批处理多个 m3u 文件
- c++ - 我没有得到匹配的功能来调用等等
- c# - WPF TreeView 不显示可观察集合中的项目
- python - 带有 PySide 2 和 QtDesigner 的 pyqtgraph