将字符串解析为参数时出现额外的空字符串

Extra empty string when parsing string into arguments

我正在尝试使用我在网上找到的以下解析函数:

    void  parse(char *line, char **argv)
    {
         while (*line != '[=10=]') {       /* if not the end of line */ 
              while (*line == ' ' || *line == '\t' || *line == '\n')
                   *line++ = '[=10=]';     /* replace white spaces with 0    */
              *argv++ = line;          /* save the argument position     */
              while (*line != '[=10=]' && *line != ' ' &&  *line != '\t' && 
              *line != '\n') 
                   line++;             /* skip the argument until ...    */
         }
         *argv = '[=10=]';                 /* mark the end of argument list  */
    }

这对我想做的事情(制作我自己的 char **argv)非常有效,但它有一个缺点。它在我的最后一个参数之后和我的 NULL 之前在我的 argv 中创建了一个额外的空字符串。你们中的任何人都可以看到我可以在哪里更改代码来解决这个问题吗?我试过使用 gdb 逐步完成,但我无法弄清楚。

示例:如果我的行只是 "1"*argv =[1, , (null)]。我需要摆脱那个空字符串。

我试过直接更改空白 space,但那行不通。例如我试过:

   char **temp = args;
   int count =0;
   while(*temp != NULL){
      *temp = *(temp +1);
      count++;}
    args[count] = NULL;

如果 line 指向的字符串以空格结尾,则您提供的代码将在参数列表的末尾包含一个空字符串(不能很好地表征为 "an empty space")。您可以通过首先截断任何尾随空格(空格、制表符、and/or 换行符)、以一种避免包含此类尾随空格的任何可能性的方式阅读 line 或通过 forcing 始终使用空格并将倒数第二行更改为 *--argv = '[=12=]'.

我观察到虽然 '[=13=]' 实际上是一个完美的 valid 空指针表达式,但它比宏 NULL,甚至在这种情况下,普通 0.