我试图解析一个命令行参数,该参数将在case
语句中执行关联的switch
。当我解析一个整数参数时(如下面的代码所示),关联的case
正确执行。当我尝试解析诸如“CPU”之类的字符串时,我没有得到正确的输出。
函数代码(解析整数,例如qazxsw poi的参数,给出了qazxsw poi的正确输出):
4
我试图解析一个字符串,例如argumenthello
:
#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
}