在寻找一种解析输入行的方法并将其与C中的某些参数分开时,我发现了这一点(从这里example for fork()
)。
我(至少认为)确实理解了大部分内容,但我在理解为什么*arguments++ = token;
有效时确实遇到了问题。如果我是对的,arguments
应该是指针数组的指针。并token
指向输入字符串的指针。因此,当while循环具有它的第一次迭代时,它会跳过第一个while循环,因为token
没有指向任何空格。
现在出现让我感到困惑的部分:arguments
获取地址token
指向的地址然后递增。精细。 但这是不是意味着,这个指针数组中的第一个指针现在指向完整的字符串"abc def ghi"
?
在给定的网站上是一张图片,我一直在想,"abc def ghi"
必须在0位,但只有abc
(这很好,完全是我想要的)。 代码是如何构成的,以便arguments[0]
包含"abc"
,而不是"abc def ghi"
?
我错过了什么或错了什么?有人能让我清醒吗?令人困惑的代码如下:
#include <stdio.h>
#include <stdlib.h`enter code here`>
void parse_cmd(char *token, char **arguments)
{
while (*token != '\0') {
while (*token == ' ' || *token == '\0' || *token == '\n')
*token++ = '\0';
/* What exactly is happening here and why does it work? */
*arguments++ = token;
while (*token != ' ' && *token != '\0' && *token != '\n'){
token++;
}
}
*arguments = '\0';
}
int main(void)
{
int i = 0;
int j = 0;
char *arguments[64];
char input[] = "abc def ghi";
parse_cmd(input, arguments);
while(arguments[i] != '\0'){
while (arguments[i][j] != '\0'){
printf("%c", arguments[i][j]);
j++;
}
puts("");
j = 0;
i++;
}
return 0;
}
答案 0 :(得分:1)
表达式
*arguments++ = token;
被解析为
*(arguments++) = token;
并且大致相当于
*arguments = token; // asign value of 'token' to the object pointed to by 'arguments'
arguments++; // advance 'arguments' to point to next object
答案 1 :(得分:0)
你问:
...现在出现让我困惑的部分:
arguments
获取地址token
指向并随后递增。精细。但这是不是意味着,这个指针数组中的第一个指针现在指向完整的字符串"abc def ghi"
?
您错过了*arguments++ = token;
上方的循环,即将其看到的空白修改为终止'\0'
的字符串。
while (*token == ' ' || *token == '\0' || *token == '\n')
*token++ = '\0';
*arguments++ = token;
终止在外循环的下一次迭代中被分配。
答案 2 :(得分:0)
我重写了
void parse_cmd(char *token, char **arguments)
到
void parse_cmd(char *token, char **args)
为了解释。
在主要功能中
char *arguments[64]; //64 member array of pointers to char
简而言之,在上面的步骤中你有64个指针。
致电时:
parse_cmd( input, arguments);
^ ^
| | args points to
token points | | arguments[0] which indeed is a
to &input[0] | | pointer to char. Since args has
| | type char*, args++ can be used
| | access the next element in
| | arguments[] ie arguments[1] to [64]
v v
void parse_cmd(char *token, char **args)
由于args的类型为char*
,因此可以使用args++
访问arguments[]
中的下一个元素,即arguments[1]
。当你这样做。
*args++ = token; // ++ done first,then *
由于操作是后缀,因此args的当前值(即arguments[0]
)在递增之前用于解除引用操作(即*)(即现在args指向arguments[1]
)。但arguments[0]
本身是指向main中声明的char的指针。添加右侧,即可获得
arguments[0]=token;//remember arguments[0] in main
在第一步。这将arguments[0]
分配给令牌,令牌是另一个指向char的指针。