[英]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.