Я написал программу, которая читает командную строку со стандартного ввода и передает ее функции, которая должна анализировать ее в токенах.Почему моя функция синтаксического анализа не возвращает все ожидаемые маркеры?
Это функция парсинга:
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 («флаг1»); печать. Но если я удалю char ** commands
и поместил printf("%s", commands[0]);
в функцию parse_cmdline, все будет работать, за исключением того, что im не назначит возврат. Почему и как это исправить?
В соответствии с просьбой, вот полнота моего кода:
#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;
}
Опубликовать минимальный, полный, поддающийся проверке пример. – EOF
Что еще вам нужно? –
Что-то, что я могу вставить в файл и скомпилировать, плюс вход, который я могу подключить к результату компиляции. Возможно, вывод я могу сравнить с выходом программы. – EOF