我很难选择getopt操作。这是我的代码的一部分。它接收一个参数文件,如果它存在,它会计算字符数。如果不是,则计算stdinput字符。
我的问题是optarg在未声明的情况下被设置为什么?我如何使我的选项-c可选并使其工作。
目前它始终从标准输入读取。
while( (option = getopt(argc, argv, "c::") ) != -1 ) {
switch(option) {
case 'c':
if (optarg == NULL) {
file = stdin;
}
else {
file = fopen(optarg, "r");
}
while( (ch = fgetc(file)) != EOF ) {
count++;
}
printf("%d %s\n", count, optarg);
fclose(file);
break;
答案 0 :(得分:1)
"标准"不支持选项的可选参数。 (POSIX)getopt()
。使用双冒号"::"
是GNU getopt()
扩展名。
让getopt()
将optarg
设置为选项""可选"参数使用调用程序的选项如下:
program -coptional_argument_to_option_c
但是,您也可以选择采用以下方法之一:
定义-c filename
filename 是必需的。如果-c filename
未命中,只计算从stdin
读取的内容。
或定义-c
没有参数告诉您的程序该做什么(在此计算)并另外定义一个选项来告诉您的程序在哪里阅读来自,如-f filename
。如果后者未读取stdin
。
答案 1 :(得分:0)
我在getopt手册中找到了这个:
两个冒号意味着一个选项需要一个可选的arg;如果当前argv-element中有文本(例如,与选项名称本身相同的单词,例如" -oarg"),则在optarg中返回,否则optarg设置为零
http://linux.die.net/man/3/getopt_long。
这页有点好些解释:
http://www.informit.com/articles/article.aspx?p=175771&seqNum=3
最后,如果optstring中的选项字母后跟两个冒号字符,则允许该选项具有可选的选项参数。 (说快三倍!)如果这个参数与选项在同一个argv元素中,则认为存在这种参数,否则不存在。在它不存在的情况下,GNU getopt()返回选项字母并将optarg设置为NULL。例如,给定 -
while ((c = getopt(argc, argv, "ab::")) != 1)
...
-for -bYANKEES,返回值为' b',optarg指向" YANKEES",而对于-b或' -b YANKEES',返回值仍然是' b'但optarg设置为NULL。在后一种情况下," YANKEES"是一个单独的命令行参数。
检查这是否也适合你。