将chars添加到现有的chars / char指针数组中?

时间:2013-04-28 01:18:32

标签: c file-io char execvp

目前我正在阅读一系列字符串并对其进行解析。我使用以下变量来执行此操作:char **parsedchar *parsed_arguments[64]。这是我用来解析它的代码:

char newcommand []
parsed =  parsed_arguments;
*parsed++ = strtok(newcommand,SEPARATORS);   // tokenize input
while ((*parsed++ = strtok(NULL,SEPARATORS)))

那部分很好,花花公子,但是当我尝试添加到parsed_arguments时出现了我的问题。我想要完成的是从文件中读取文本,将其放在char buffer[]中,对其进行标记,然后将其添加到parsed_arguments,以便我可以使用execvp将这些参数传递给程序。到目前为止,我能够阅读文本并将其放入我的缓冲区,我甚至尝试将其标记化,但最后一部分让我感到困惑。这里有更多代码详细说明了我正在做的事情:

if(file_In)
  {
    //strcpy(input_File_Name,parsed_arguments[input_Index]);

    switch(pid =fork())
      {
      case -1:
        printf("fork error, aborting\n");
        abort();
      case 0:
        parsed_arguments[input_Index-1] = NULL; 
        input_File = freopen(parsed_arguments[input_Index],"r",stdin);
        fgets(buffer, 1023, input_File);

        buf =  parsed_buf;
        *buf++ = strtok(buffer,SEPARATORS);   // tokenize input
        while ((*buf++ = strtok(NULL,SEPARATORS)))

        //strcat(parsed, buf); // invalid

        printf("The buffer holds: %s\n", buffer);
        execvp(parsed_arguments[0],parsed_arguments);

        break;
      default:
        waitpid(pid,NULL,WUNTRACED);

1 个答案:

答案 0 :(得分:0)

我想你可能会过度思考这个问题。基于问题顶部的解析代码,您已经解决了问题。

parsed =  parsed_arguments; 
/* parsed now points to the first element parsed_arguments */
*parsed++ = strtok(newcommand,SEPARATORS);   // tokenize input
while ((*parsed++ = strtok(NULL,SEPARATORS)))
    ; /* habit of mine */
/* At this point, parsed_arguments should be now populated with each
   token from newcommand by strtok
   Minus a few caveats, the following call should be valid */
execvp(parsed_arguments[0], parsed_arguments);

在我描述我提到的警告(我知道)之前,我会快速解释为什么这应该有效: strtok返回在其第一个参数中找到的最后一个标记的指针。然后将此指针写入此变量:*parsed++(这是一个计算为l值的表达式)。这取消引用parsed指向的地址(parsed_arguments的元素)。最后,修复后的++运算符只会使parsed指向{/ 1}} 的下一个元素后评估完整表达式。

需要注意的重要一点是,parsed_arguments指向parsed占用的同一块内存。通过设置parsed_argumentsparsed = parsed_arguments相当于*parsed = token

如果没有指针算术,你可以表达你的代码(不太优雅):

parsed_arguments[some_index] = token

我希望这是你正在寻找的答案,或者至少根据提供的实际代码帮助指明你正确的方向(由于显而易见的原因,很多东西都缺失了),并且有一个{{1似乎模仿int argc = 0; /* declarations, etc *SNIP* */ parsed_arguments[argc] = strtok(newcommand, delim); while (parsed_arguments[argc++]) { parsed_arguments[argc] = strtok(NULL, delim); } parsed_buf的{​​}},buf,但代码中也存在这些内容,如果我完全理解您要做的事情,我并不是百分之百确定。< / p>

<强>注意事项

parsed的文档说明按照惯例,参数的第一个元素应该是文件名(我知道你已经知道了),但是,请确保程序名称是第一个元素 - - 您的文件内容首先具有程序名称,或者只从第二个元素开始。

parsed_arguments还声明最后一个参数应该是NULL指针。您可以通过调用execvp(...)来确保这一点,并确保文件永远不会指定超过64个参数。

http://linux.die.net/man/3/execvp

最后,(可能是挑选),execvp(...)的前提是memset(parsed_arguments, 0, sizeof(parsed_arguments));(在大多数情况下,它是while (pointer) AFAIK),我不知道它有多重要对你而言,但如果你遇到NULL == 0未定义为0的实现,则可能会导致一些问题。因此,编写(void *) 0会更安全。无论如何我的两分钱。