Я пытаюсь проанализировать аргумент командной строки, который, в свою очередь, выполнит связанный 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;
}
0
p.luck 13 Апр 2019 в 18:33

2 ответа

Лучший ответ

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

Вы не можете преобразовать строку в перечисление как это. Вы просто конвертируете указатель на строку в 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
Jean-François Fabre 13 Апр 2019 в 16:35