2011-12-08 18 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

谢谢,我帮了我很多。我放了我的代码放在我没有把它放在这里。咄! –