簡體   English   中英

命令行解析:如何將字符串解析為參數

[英]Command-line parsing: How to parse a string as an argument

我試圖解析一個命令行參數,該參數將在switch語句中執行一個關聯的case 當我解析整數參數時(如下面的代碼所示),關聯的case正確執行。 當我嘗試解析諸如“ CPU”之類的字符串時,我沒有得到正確的輸出。

功能代碼(解析的整數例如參數4給出athe正確的輸出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;
}

您不能將字符串轉換為這樣的枚舉。 您正在做的只是將指針轉換為字符串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找到了一個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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM