【问题标题】:Command-line parsing: How to parse a string as an argument命令行解析:如何将字符串解析为参数
【发布时间】:2019-09-04 03:11:19
【问题描述】:

我正在尝试解析一个命令行参数,该参数将在switch 语句中执行关联的case。当我解析一个整数参数时(如下面的代码所示),关联的case 正确执行。当我尝试解析诸如“CPU”之类的字符串时,我没有得到正确的输出。

函数代码(解析一个整数,例如4的参数给出hello的正确输出):

#include <stdio.h>

int main(int argc, char *argv[]) {

    char execution_mode = atoi (argv[1]);

    switch (execution_mode)
    { 
    case (4) : 
        printf("Hello");
        getchar();
        break;
    case (8) :
        printf("Goodbye");
        getchar();
        break;
    default:
        printf("Error! execution mode is not correct");
        getchar();
        break;
    }

    return 0;
}

我尝试解析 字符串 例如论据CPU

#include <stdio.h>

int main(int argc, char *argv[]) {

    typedef enum MODE { CPU, OPENMP } MODE;
    MODE execution_mode = (char)argv[1];

    switch (execution_mode)
    { 
    case (CPU) : 
        printf("Hello");
        getchar();
        break;
    case (OPENMP) :
        printf("Goodbye");
        getchar();
        break;
    default:
        printf("Error! execution mode is not correct");
        getchar();
        break;
    }

    return 0;
}

【问题讨论】:

    标签: c parsing cmd switch-statement arguments


    【解决方案1】:

    您不能像这样将字符串转换为枚举。您所做的只是将指向字符串的指针转换为char。失败了。

    避免这种情况的一种替代方法(除了将第一个参数与strcmp 进行比较之外)是为您的枚举提供一个字符值:

    typedef enum { CPU='C', OPENMP='O' } MODE;
    

    现在您可以选择第一个参数的第一个字母并进行转换:

    MODE execution_mode = (MODE)argv[1][0];
    

    这些字母当然必须完全不同。并检查argc&gt;1 以查看argv[1] 是否有效,当然

    如果你想要完整的字符串匹配,你别无选择,只能使用strcmp

    const char *execution_mode = argv[1];
    
    if (strcmp(execution_mode,"CPU")==0)
    { 
      // do something
    }
    else if (strcmp(execution_mode,"OPENMP")==0)
    {
      // do something else
    }
    

    【讨论】:

    • 我认为 strcmp 方法可以为我工作 - 我正在考虑做一个像这样的if 语句:if (strcmp("CPU", argv[1])) {.....} 但我不知道如何从大括号内调用这个案例,比如那。你知道我该怎么做吗?
    【解决方案2】:

    在回答此问题的用户的帮助下,我找到了使用strcmp 的有效解决方案,如下所示。我还添加了一些错误检查以确保在命令行中输入了足够的参数。

    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
    
        //Ensure there are enough arguments 
        if (argc < 2)
        {
            printf("Error: not enough arguments");
            exit(1);
        }
    
        typedef enum MODE { CPU, OPENMP, CUDA, ALL } MODE;
        MODE execution_mode = (MODE)argv[1];
    
        //Compare string with command-line arguments 
        if (strcmp("CPU", execution_mode) == 0)
        {
            //selects CPU case
            execution_mode = CPU; 
        }
        else if (strcmp("OPENMP", execution_mode) == 0)
        {
            //selects OPENMP case 
            execution_mode = OPENMP; 
        }
        else
        {
            printf("invalid arg");
        }
    
        //Switch statement 
        switch (execution_mode)
        { 
        case (CPU) : 
            printf("CPU MODE SELECTED");
            getchar();
            break;
        case (OPENMP) :
            printf("OPENMP MODE SELECTED");
            getchar();
            break;
        default:
            printf("Error: execution mode is not correct");
            getchar();
            break;
        }
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 2016-12-10
      • 2023-03-21
      • 1970-01-01
      • 2023-04-06
      • 2020-11-11
      • 1970-01-01
      相关资源
      最近更新 更多