首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >命令行解析:如何将字符串解析为参数

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

Stack Overflow用户
提问于 2019-04-13 15:33:56
回答 2查看 588关注 0票数 0

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

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

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-13 16:48:30

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

代码语言:javascript
运行
复制
#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;
}
票数 0
EN

Stack Overflow用户

发布于 2019-04-13 15:38:05

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

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

代码语言:javascript
运行
复制
typedef enum { CPU='C', OPENMP='O' } MODE;

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

代码语言:javascript
运行
复制
MODE execution_mode = (MODE)argv[1][0];

这些信当然各不相同。当然,检查argc>1以确定argv[1]是否有效。

如果要进行完全字符串匹配,则除了使用strcmp之外别无选择。

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55667112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档