2011-12-08 19 views
1

使用的getopt我希望把一個子選項中的字符串,這樣我可以把它當作一個文件名讀取文件:在命令行,如果我輸入的選擇在C

char *nvalue = NULL; 
char *dvalue = NULL; 
char *input = NULL; 
char inputfilename[] = "\""; 
int ar; 

int main(int argc, char *argv[]) 
{ 
    while ((ar = getopt(argc, argv, "hn:d:i:")) != -1) 
     switch (ar) 
     { 
     case 'h': 
      printf("something"); 
      break; /* added */ 
     case 'n': 
      nvalue = optarg; 
      if (isdigit(nvalue)) 
       stop = atoi(nvalue); 
      else 
       printf("something\n"); 
      break; /* added */ 
     case 'd': 
      dvalue = optarg; 
      if (!strcmp(dvalue, "FCFS") || !strcmp(dvalue, "SSTF") || 
       !strcmp(dvalue, "C-SCAN") || !strcmp(dvalue, "LOOK")) 
       ; 
      else 
       printf("Invalid type of disk scheduling policy entered.\n"); 
      break; /* added */ 
     case 'i': 
      input = optarg; 
      strcpy(inputfilename, optarg); 
      printf("Filename :%s\n", inputfilename); 
      break; 
     } 
    /* ... */ 
} 

所以:

./foobar -i hello 

那麼我應該能夠讀取該文件:

FILE *file = fopen(inputfilename, "r"); 

有什麼建議?答案? 謝謝!

+0

這段代碼有什麼問題?我添加了中斷來切換選項,聲明停止變量幷包含適當的文件,並按照您的要求工作。所以我不知道我該怎麼幫你。 – Patryk

回答

2

您的代碼有許多問題。我忽略了頭文件的缺失(假設你的代碼使用了正確的代碼,所以所有的函數在使用前都有一個原型)。我也在無情地重新格式化您的代碼,但沒有進一步評論。

char *nvalue = NULL; 
char *dvalue = NULL; 
char *input = NULL; 
char inputfilename[] = "\""; 

這分配了兩個字節的數組作爲inputfilename。我不喜歡在使用它時會發生什麼事情。

int ar; 

種種原因,這個變量應該是當地的主要功能及無理由可見它是一個全局變量。除非你有一個頭部聲明它們,否則其他變量也應該是static - 假設你需要訪問main()以外的值而沒有一個方便的方式將它們作爲本地傳遞。儘可能避免使用全局變量。

int main(int argc, char *argv[]) 
{ 
    while ((ar = getopt(argc, argv, "hn:d:i:")) != -1) 
    { 
     switch (ar) 
     { 
     case 'h': 
      printf("something"); 

糟糕;沒有break,所以代碼下降到case 'n':代碼。 C不是帕斯卡。

 case 'n': 
      nvalue = optarg; 
      if (isdigit(nvalue)) 
       stop = atoi(nvalue); 

您尚未顯示stop的聲明。除非你真的需要這個字符串,否則你可以不用nvalue,避免一個總是需要的全局變量。

  else 
       printf("something\n"); 

另一個缺失break;我不打算再指出。

 case 'd': 
      dvalue = optarg; 
      if (strcmp(dvalue, "FCFS") == 0 || 
       strcmp(dvalue, "SSTF") == 0 || 
       strcmp(dvalue, "C-SCAN") == 0 || 
       strcmp(dvalue, "LOOK" == 0) 
      { 

我會建議一條評論,如/* Nothing - dvalue is OK */。或採用反相德·摩根定理的條件:

  if (strcmp(dvalue, "FCFS") != 0 && 
       strcmp(dvalue, "SSTF") != 0 && 
       strcmp(dvalue, "C-SCAN") != 0 && 
       strcmp(dvalue, "LOOK" != 0) 

你甚至可能決定該測試封裝成測試對代碼的數組中的每個元素的值的函數。

  } 
      else 
       printf("Invalid type of disk scheduling policy entered.\n"); 

這將是有禮貌提供可接受值的列表 - 它突然變得另一個原因具有您可以用它來生成列表有效值的數組。通常,應在stderr(使用fprintf())而不是stdout上報告錯誤消息。

 case 'i': 
      input = optarg; 

這項分配就足夠了。

  strcpy(inputfilename, optarg); 

除非用戶鍵入一個字符的文件名,你剛剛溢出inputfilename陣列。除非要修改名稱(例如,在名稱上添加或更改擴展名),否則不需要複製該參數。

   //strcat(inputfilename,"\""); 
      printf("Filename :%s\n", inputfilename); 
     } 

您沒有包含default子句。由於ar將在用戶提供的選項未被識別時分配值?,通常這是您提供簡單的使用消息並退出的提示。

+0

謝謝,我幫了我很多。我放了我的代碼放在我沒有把它放在這裏。咄! –