【问题标题】:Extra empty string when parsing string into arguments将字符串解析为参数时额外的空字符串
【发布时间】:2015-04-24 01:39:34
【问题描述】:

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

    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;

【问题讨论】:

  • 我无法复制您的问题。
  • 有趣。我无法想象我的其他代码搞砸了。我所做的只是将文件的一行读入缓冲区。感谢您的尝试!
  • Blank 好像不存在。
  • Check DEMO[1, NULL]
  • 如果我的行只是“1”"1" --> "1\n"

标签: c parsing exec


【解决方案1】:

如果line 指向的字符串以空白。您可以通过首先截断任何尾随空格(空格、制表符和/或换行符)、以避免包含此类尾随空格的任何可能性的方式读取 line 或通过强制来避免这种情况始终使用空格并将倒数第二行更改为*--argv = '\0'

当我这样做时,我观察到虽然'\0' 实际上是一个完美的有效 空指针表达式,但它却远不如宏NULL 清晰,甚至,在这种情况下,纯 0

【讨论】:

  • 好点。我会改变我的措辞。而且我认为我尝试了该解决方案但没有成功,但我会再试一次并确保。
  • 我的立场是正确的。我在 argv 上进一步尝试了该功能。多余的空字符串消失了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多