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

C 命令行解析:如何将字符串解析为参数,c,parsing,cmd,switch-statement,arguments,C,Parsing,Cmd,Switch Statement,Arguments,我试图解析一个命令行参数,该参数将在switch语句中执行相关的case。当我解析一个整数参数(如下面的代码所示)时,关联的大小写正确执行。当我试图解析诸如“CPU”之类的字符串时,我没有得到正确的输出 功能代码(解析一个整数,例如4的参数给出了hello的正确输出): 不能像这样将字符串转换为枚举。您所做的只是将指向字符串的指针转换为char。它失败了 一种避免这种情况的替代方法(除了将第一个参数与strcmp进行比较外)是为枚举指定一个字符值: typedef enum { CPU='C',

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

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


不能像这样将字符串转换为枚举。您所做的只是将指向字符串的指针转换为
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
}

在回答此问题的用户的帮助下,我使用
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;
}
#包括
int main(int argc,char*argv[]){
//确保有足够的论据
如果(argc<2)
{
printf(“错误:参数不足”);
出口(1);
}
typedef枚举模式{CPU、OPENMP、CUDA、ALL}模式;
模式执行模式=(模式)argv[1];
//将字符串与命令行参数进行比较
如果(strcmp(“CPU”,执行模式)==0)
{
//选择CPU机箱
执行模式=CPU;
}
否则如果(strcmp(“OPENMP”,执行模式)==0)
{
//选择OPENMP案例
执行模式=OPENMP;
}
其他的
{
printf(“无效参数”);
}
//开关语句
开关(执行模式)
{ 
机箱(CPU):
printf(“选择CPU模式”);
getchar();
打破
案例(OPENMP):
printf(“选择OPENMP模式”);
getchar();
打破
违约:
printf(“错误:执行模式不正确”);
getchar();
打破
}
返回0;
}

我认为strcmp方法对我来说是可行的-我想做一个
if
语句,像这样:
if(strcmp(“CPU”,argv[1]){….}
,但我不确定如何从这样的花括号中调用这个案例。你知道我怎么做吗?
const char *execution_mode = argv[1];

if (strcmp(execution_mode,"CPU")==0)
{ 
  // do something
}
else if (strcmp(execution_mode,"OPENMP")==0)
{
  // do something else
}
#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;
}