C命令行参数,标记化

时间:2014-04-01 09:00:53

标签: c command-line-arguments tokenize

我正在尝试编写一个函数来解析命令行参数到向量中。问题是我似乎无法消除使用全局指针数组作为向量。

代码是:

/** parse command line arguments into a global vector */
char vects[8][32] = {0};

int str_tokenizer(const char str[], char delim)
{
   extern char vects[8][32];
   int i,num_delim=0, num_vects;
   int str_len=strlen(str);

   for(i=0;i<str_len;i++)
   {
      if(str[i]==delim)
      num_delim++;
   }

   num_vects=num_delim+1;

   int x=0;
   vects[num_vects][32];
   for(i=0;i<num_vects;i++)
   {
      //printf("%i", i);
      int y=0;
      while(str[x]!=delim && str[x]!='\0')
      {
         //printf("%c", str[x]);
         vects[i][y++]=str[x++];
      }
      vects[i][y]='\0';
      x++;
   }
   return (num_vects);
}

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

我认为你在一个功能中做得太多了。您应该一方面分离解析任务(只是隔离原始字符串的子串,即发现起始和结束索引),另一方面将字符串添加到列表中。要替换2D数组,可以使用链接列表。但解析代码不应该担心这一点,只需扫描下一个分隔符。从起始位置减去结束位置以获得长度,并调用append_string_to_list()函数,传递完整的源字符串以及起始索引和长度。

顺便说一下,你引用这个数组

char vects[8][32] = {0};

作为“全局指针数组”。它不是一个指针数组。它是一个字符数组的数组。可以肯定的是,如果您使用数组的 slice ,通过不指定第二个索引,那么它将工作,好像它是一个指针 - 它会衰减到函数调用中的指针 - 但真正的指针数组看起来像这样:

char *vects[8];