在c中切换案例参数

时间:2018-03-12 11:49:38

标签: c switch-statement

这可能看起来很简单,但我无法找到使用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:
    ...

4 个答案:

答案 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]-。如果没有,请输入错误并退出。
    • {li> switch argv[i][1]