如何比较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
}
但这会产生分段错误。我做错了什么?
感谢。
答案 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
递增两次,这也会导致未定义的行为,即可能的分段错误。我在这里修好了。