1

我希望在字符串中放置一个子选项,以便可以将其用作文件名来读取文件:

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" );

有什么建议么?答案?谢谢!

4

1 回答 1

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将被赋值,这通常是您提供简单使用消息并退出的提示。?

于 2011-12-08T05:19:08.123 回答