这个解析函数究竟发生了什么?

时间:2016-05-19 18:39:04

标签: c parsing pointers

在寻找一种解析输入行的方法并将其与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;
}

3 个答案:

答案 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的指针。