easy c question:比较char数组的第一个char

时间:2010-05-29 21:36:28

标签: c arrays

如何比较char **的第一个元素的第一个字母?

我试过了:

int main()
{
    char** command = NULL;
    while (true)
    {
        fgets(line, MAX_COMMAND_LEN, stdin);
        parse_command(line, command);
        exec_command(command);
    }
}

void parse_command(char* line, char** command)
{
    int n_args = 0, i = 0;
    while (line[i] != '\n')
    {
        if (isspace(line[i++]))
            n_args++;
    }

    for (i = 0; i < n_args+1; i++)
        command = (char**) malloc (n_args * sizeof(char*));

    i = 0;
    line = strtok(line," \n");
    while (line != NULL)
    {
        command[i++] = (char *) malloc ( (strlen(line)+1) * sizeof(char) );
        strcpy(command[i++], line);
        line = strtok(NULL, " \n");
    }
    command[i] = NULL;
}

void exec_command(char** command)
{
    if (command[0][0] == '/')
            // other stuff
}

但这会产生分段错误。我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:2)

你能粘贴更多代码吗?您是否为char *数组和char *数组的元素分配了内存?

答案 1 :(得分:1)

问题是,你在parse_command内部分配一个char *数组,但是指向该数组的指针永远不会离开该函数。所以exec_command获取垃圾指针值。原因是,通过调用parse_command(line, command),您传递指针command的当前值的副本,然后在函数内部覆盖 - 但原始值不受此影响!

要实现这一点,您需要将指针传递给要更新的指针,或者需要将指针从parse_command返回到已分配的数组。除了char***看起来很丑陋(至少对我来说),后一种方法更简单易读:

int main()
{
    char** command = NULL;
    while (true)
    {
        fgets(line, MAX_COMMAND_LEN, stdin);
        command = parse_command(line);
        exec_command(command);
    }
}

char** parse_command(char* line)
{
    char** command = NULL;
    int n_args = 0, i = 0;
    while (line[i] != '\n')
    {
        if (isspace(line[i++]))
            n_args++;
    }

    command = (char**) malloc ((n_args + 1) * sizeof(char*));

    i = 0;
    line = strtok(line," \n");
    while (line != NULL)
    {
        command[i] = (char *) malloc ( (strlen(line)+1) * sizeof(char) );
        strcpy(command[i++], line);
        line = strtok(NULL, " \n");
    }
    command[i] = NULL;
    return command;
}

注意:

  • 在原始parse_command中,您在循环中将内存分配给command,这是不必要的,只会造成内存泄漏。一次分配内存就足够了。我假设您希望command包含n_args + 1指针,因此我相应地修改了代码。
  • while的最后parse_command循环中,您错误地将i递增两次,这也会导致未定义的行为,即可能的分段错误。我在这里修好了。