命令行解析:如何将字符串解析为参数

时间:2019-04-13 15:33:56

标签: c parsing cmd switch-statement arguments

我正在尝试解析命令行参数,该参数将依次在case语句中执行关联的switch。当我解析整数参数时(如下面的代码所示),关联的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;
}

2 个答案:

答案 0 :(得分:1)

您不能将字符串转换为这样的枚举。您正在做的只是将指针的字符串转换为char。哪个失败。

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

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

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

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

字母当然必须全部不同。然后检查argc>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
}

答案 1 :(得分:0)

在回答此问题的用户的帮助下,我通过使用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;
}