这可能看起来很简单,但我无法找到使用switch case语句的语法。我想在命令行中给出如下命令:
dumpFile -t TYPE -c Filename
dumpFile -c Filename
在我需要的两种情况下,' -c'选择以不同的方式工作。在第一种情况下,我首先检查类型,然后使用' -c'选项。在后者我不检查任何类型和执行一些不同的操作。
我想知道适用于两者的开关盒。就像只有' -c'选项参数是argv [2],而在前者(' t'和'两者)中,argv是4:argv [4]。我尝试过什么只适用于(&# 39; -t'和' -c'在一起但是找不到任何方法如何使用第二个开关盒(只有' c')
Code:
while ((i = getopt(argc, argv, "tc:o")) != EOF) {
switch (i){
case 't':
if(strcmp(argv[2],"SomeType") == 0){
fprintf(stdout, "type matched\n");
}
break;
case 'c':
open_f(argv[4], hBuf);
if(strcmp(hBuf, "8000") == 0 && strcmp(argv[2], "someType") == 0){
fprintf(stdout, "Command:..");
// If I use argv[2] here, upper part will also execute which I don't want in second command
// do some stuff
break;
case 'o':
case default:
...
答案 0 :(得分:2)
您应该使用显示为here
的optarg
getopt()函数返回argv中与optstring中的字符匹配的下一个选项字符(如果找到),如果有匹配的字符。如果该选项接受参数,则getopt()将变量optarg设置为指向option-argument,如下所示:
如果该选项是argv元素指向的字符串中的最后一个字符,则optarg包含argv的下一个元素,optind将增加2.如果optind的结果值不小于argc,则表示缺少option-argument,getopt()返回错误指示。
否则,optarg指向argv元素中选项字符后面的字符串,optind加1。
答案 1 :(得分:1)
在我需要的两种情况下,' -c'以不同方式工作的选项。与第一种情况相似,
使用一个选项来表示两个不同的东西似乎是糟糕的设计。这意味着用户不仅要记住选项的几个含义,还要记住如何触发他们想要的那个。
我想知道适用于这两种情况的开关盒。
您似乎想在一个地方做太多事情。如果你只是处理命令的参数(包括选项,首先),然后弄清楚程序应该如何表现,你可能会更好。例如,如果在参数列表中看到-c
选项,则只需设置一个表示该选项已设置的变量。
我无法找到使用switch case语句的语法。
您已将switch
的语法缩小了;问题是,您正在尝试实施一些错综复杂的逻辑,并且您正在使用错误的工具来执行此操作。找出你先获得的参数,然后使用该信息来确定程序的行为。此外,如果选项的顺序很重要,switch
可能不是正确的方法。您似乎期望特定订单,因为您已将精确索引用于argv
:
if(strcmp(argv [2]," SomeType")== 0){
但是你的交换机中的情况可以按任何顺序排列。如果你像这样被召唤,你会怎么做?
> dumpfige -c -t TYPE Filename
答案 2 :(得分:1)
这就是getopt
设置变量optarg
的原因。请参阅the documentation for getopt
。
此外,任何需要参数的标志都应该紧跟一个冒号,而不仅仅是列表后面的某个地方。
一个工作示例:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char** argv) {
int opt;
while ((opt = getopt(argc, argv, "t:c:o")) != -1) {
switch (opt) {
case 't':
printf("type: %s\n", optarg);
break;
case 'c':
printf("command: %s\n", optarg);
break;
case 'o':
printf("other\n");
break;
}
}
return 0;
}
答案 3 :(得分:0)
getopt
可能对你的需求太过生硬了。您可以使用手动解析来替换它:
argc
并确保有开头的参数。for(size_t i=1; i<argc; i++)
,跳过索引0。
strlen(argv[i])
是&gt; = 2.如果没有,请输入错误并退出。argv[i][0]
是-
。如果没有,请输入错误并退出。switch
argv[i][1]
。