簡體   English   中英

Optarg和命令行參數

[英]Optarg and Command Line Arguments

我正在從用戶那里獲取命令行參數。

然后,我為命令切換大小寫,例如:

    case 'f':
         *file_name = optarg;
         break;

我不確定是否需要為指針分配malloc,因為我不完全了解optarg。

這是聲明file_name的方式:

char **file_name;

我應該做

int length = strlen(optarg); // This gives a warning about types when compiling.

然后malloc為字符串長度+ 1?

對於這種問題,應如何完成malloc? 請記住,用戶在file_name中輸入** argv。

編輯:這就是我如何調用此函數,仍然出現分段錯誤。

int main(int argc, char **argv)
{
   char **file_name;
   parser(argc, argvm file_name);
}

void parser(int argc, char **argv, char **file_name)
{
  // Switch cases.
}

“ optarg”只是指向argv []中元素的指針。 因此,不分配內存並復制'optarg'指向的值是安全的。

假設使用以下參數調用了programm:

myapp -a "hello" -b "world"

而您的代碼是:

#include <stdio.h>
#include <getopt.h>

void parse_options(int argc, char* argv[], char ** first_arg, char ** second_arg)
{
  const char* opt_string = "a:b:";
  int opt = -1;
  opt = getopt(argc, argv, opt_string);
  while (opt != -1) {
    switch(opt) {
      case 'a':
        *first_arg = optarg; /* points to argv[2]="hello" */
        break;
      case 'b':
        *second_arg = optarg; /* points to argv[4]="world" */
        break;
      default:
        break;
      }
    opt = getopt(argc, argv, opt_string);
  }
}

int main(int argc, char* argv[])
{
  char* first = 0;
  char* second = 0;
  parse_options(argc, argv, &first, &second);
  printf("first=%s, second=%s\n", first, second);
  return 0;
}

我的輸出:

freebsd% gcc -Wall main.c
freebsd% ./a.out -a hello -b world
first=hello, second=world

您說您有:

char **file_name;
...
switch (opt)
{
case 'f':
     *file_name = optarg;
     break;
...
}

代碼崩潰是因為您尚未分配空間或未初始化變量file_name

您需要做什么取決於您要發生的事情。 通常,您會將file_name的定義更改為:

char *file_name = 0;
...
switch (opt)
{
case 'f':
     file_name = optarg;
     break;
...
}

這樣,您可以在循環/切換之后檢測是否提供了文件名,並且可以提供默認值或報告錯誤(如果沒有)。 您可以檢測以前是否提供過文件名,如果是,則提供對象。

另一種方案是您希望在命令行上多次使用-f 然后,您需要建立一個指針數組,並對其進行計數。 您可能會寫:

char **file_name = 0;
size_t num_files = 0;
size_t max_files = 0;
...
switch (opt)
{
case 'f':
     if (num_files == max_files)
     {
         size_t new_files = (max_files + 2) * 2;
         void  *new_space = realloc(file_name, new_files * sizeof(*file_name));
         if (new_space == 0)
             ...report out of memory error...
         file_name = new_space;
         max_files = new_files;
     }
     file_name[num_files++] = optarg;
     break;
...
}

它使用realloc()的奇數屬性,即如果傳入的指針為NULL,它將模擬malloc() 另外,您可以在循環外部進行初始的malloc()分配,並在循環內部進行(相同) realloc() 大小的計算會在第一次時分配4個條目,然后分配12個,然后分配28個,依此類推。如果您擔心分配過多,可以在循環完成后將realloc()再次使用以將大小調整為正確的大小,但影響不會太大。

循環后,您可以使用以下文件列表:

for (size_t i = 0; i < num_files; i++)
    process_file(file_name[i]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM