我正在尝试解析命令行参数,该参数将依次在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 :(得分:1)
您不能将字符串转换为这样的枚举。您正在做的只是将指针的字符串转换为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 :(得分:0)
在回答此问题的用户的帮助下,我通过使用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;
}