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

时间:2015-04-24 01:39:34

标签: c parsing exec

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

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

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

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

我已经尝试过直接更改空白区域,但这不起作用。例如,我尝试过:

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

1 个答案:

答案 0 :(得分:3)

如果由line指向的字符串,您提供的代码将在参数列表的末尾包含一个空字符串(未被很好地表征为“空空格”)以空白结束。您可以通过首先截断任何尾随空格(空格,制表符和/或换行符)来避免这种情况,方法是以避免任何可能包含此类尾随空格的方式读取*--argv = '\0',或者通过强制 whitespace总是将倒数第二行改为'\0'

虽然我正在观察它,但我观察到虽然NULL实际上是空指针的完美有效表达式,但它远不如宏{{1}在这种情况下,简单地0