我很难让getopt操作可选。这是我代码的一部分。它接受一个参数文件,如果它在那里,它会计数字符的数量。如果没有,则对stdinput字符进行计数。
我的问题是,在未声明的情况下,optarg会被设置为什么?以及如何使我的选项-c可选,并使这一工作。
目前,它总是从stdin读取。
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;发布于 2014-11-05 08:06:38
选项的可选参数不受“标准”(POSIX) getopt()的支持。双冒号"::"的使用是一个getopt()扩展。
要让getopt()将optarg设置为选项的“可选”参数,请在调用程序时使用以下选项:
program -coptional_argument_to_option_c但是,您也可以采取下列方法之一:
-c filename,文件名是强制性的。如果-c filename漏掉了,只需数一数从stdin读取的内容。-c,告诉您的程序要做什么,(在这里计数),并另外定义一个选项,告诉您的程序从读取的位置,比如-f filename。如果后者没有读到stdin的话。发布于 2015-10-27 14:02:45
我在getopt手册中找到了这个:
两个冒号表示一个选项接受一个可选的arg;如果当前argv-元素中有文本(例如,在选项名称本身的同一个单词中,例如"-oarg"),那么它将在optarg中返回,否则optarg被设置为零。
long。
这一页解释得更好一些:
http://www.informit.com/articles/article.aspx?p=175771&seqNum=3
最后,如果optstring中的选项字母后面跟着两个冒号,则该选项允许具有可选选项参数。(说得快三次!)如果这样的论点与选项在同一个argv元素中,则被认为是存在的,否则就不存在了。在不存在的情况下,getopt()返回选项字母并将optarg设置为NULL。例如,考虑到-
while ((c = getopt(argc, argv, "ab::")) != 1) ...
-for -bYANKEES,返回值是'b',optarg指向“扬基队”,而对于-b或'-b扬基队‘,返回值仍然是'b’,但optarg设置为空。在后一种情况下,“北方佬”是一个单独的命令行论点。
看看这个是否也适用于你。
https://stackoverflow.com/questions/26752185
复制相似问题