Разбор командной строки: как разобрать строку в качестве аргумента - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь проанализировать аргумент командной строки, который, в свою очередь, выполнит связанный 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 ]

1 голос
/ 13 апреля 2019

Нельзя преобразовать строку в перечисление, подобное этому. Вы просто конвертируете указатель на строку в 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
}
0 голосов
/ 13 апреля 2019

С помощью пользователей, ответивших на этот вопрос, я нашел рабочее решение с помощью 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;
}
...