gpt4 book ai didi

c - 为什么我的解析函数返回不返回所有预期的标记?

转载 作者:行者123 更新时间:2023-11-30 21:00:25 24 4
gpt4 key购买 nike

我编写了一个程序,它从标准输入读取命令行,并将其传递给一个应该将其解析为 token 的函数。

这是解析函数:

char** parse_cmdline(char* cmdline) {
char ** arr = malloc(10 * sizeof(char*));
for (int i =0 ; i < 10; ++i)
arr[i] = malloc(30 * sizeof(char));
char * token = strtok(cmdline, " ");
int i = 0;
while(token != NULL) {
if(i > 9) arr = realloc(arr, (i+10)*sizeof(char*) );
arr[i] = token;
token = strtok(NULL, " ");
i++;
}
printf("flag1");
return arr;
}

这就是我使用它的方式 main():

int main() {
int status;
pid_t pid;
pid = fork();

while(1) {
if(pid < 0) {
status = -1;
perror("Fork");
} else if(pid == 0) {
char* cmd;
printf("$");
if(fgets(cmd, sizeof cmd, stdin) == NULL) break;
parse_cmdline(cmd);
} else {
if( waitpid(pid, &status, 0) != pid ) {
status = -1;
}
break;
}
}


return 0;
}

这是我向程序提供的输入示例:

ls l a

预期输出应该是:

l

(即第二个参数,由我的解析函数打印)

实际上什么也没发生。甚至连 printf("flag1"); 也没有打印。但是,如果我删除 char ** 命令 并将 printf("%s",commands[0]); 放入 parse_cmdline 函数中,则一切正常,除了我不能分配返回。为什么以及如何解决它?

<小时/>

根据要求,这是我的完整代码:

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

char** parse_cmdline(char* cmdline) {
char ** arr = malloc(10 * sizeof(char*));
for (int i =0 ; i < 10; ++i)
arr[i] = malloc(30 * sizeof(char));
char * token = strtok(cmdline, " ");
int i = 0;
while(token != NULL) {
if(i > 9) arr = realloc(arr, (i+10)*sizeof(char*) );
arr[i] = token;
token = strtok(NULL, " ");
i++;
}
printf("%s\n", arr[1]);
return arr;
}

最佳答案

这部分看起来很奇怪 - 请参阅内联评论:

char ** arr = malloc(10 * sizeof(char*));
for (int i =0 ; i < 10; ++i)
arr[i] = malloc(30 * sizeof(char)); // Here you allocate memory
// for holding a part of the command

char * token = strtok(cmdline, " ");
int i = 0;
while(token != NULL) {
if(i > 9) arr = realloc(arr, (i+10)*sizeof(char*) );

arr[i] = token; // But here you overwrite the pointer value and
// and thereby create a memory leak

token = strtok(NULL, " ");
i++;
}

也许您想进行字符串复制 - 例如:

strcpy(arr[i], token);   // Instead of arr[i] = token;

此外,这一行看起来很奇怪:

if(i > 9) arr = realloc(arr, (i+10)*sizeof(char*) );

您增加了arr,以便它可以容纳更多的char*,但这次您没有像最初那样为新字符串分配内存。

关于c - 为什么我的解析函数返回不返回所有预期的标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41522499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com