目前我正在阅读一系列字符串并对其进行解析。我使用以下变量来执行此操作:char **parsed
和char *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);
答案 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_arguments
,parsed = 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
会更安全。无论如何我的两分钱。