Я работаю над программой, которая действует как интерпретатор оболочки, которая читает команды с аргументами и создает дочерний элемент, который выполняет команду с execvp()
.Я застрял на некоторых манипуляциях со строками для сбора массива символов *args[]
, особенно с использованием fgets
и strtok
.
Вот MCVE моего кода.
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define MAX_LINE 80
int main(void){
//initialize variables
char *args[MAX_LINE/2 + 1];
char input[MAX_LINE];
//char input[MAX_LINE] = "some sentence unknown"; // <-- this line works fine..
int counter = 0;
printf("COMMANDER>");
fflush(stdout);
//receive input
fgets(input,MAX_LINE,stdin);
//parse input
char *parser;
parser = strtok(input," \r\t");
//parse line
while(parser != NULL){
args[counter] = parser;
counter++;
parser = strtok(NULL," ");
}
//print results
int i = 0;
for(i = 0; i < counter + 1;i++){
printf("1");
printf(" - %d: %s\n",i,args[i]);
}
return 0;
}
Проблема здесь в выходе.Когда я пытаюсь запустить это, я получаю следующий вывод:
COMMANDER>some sentence unknown
1 - 0: some
1 - 1: sentence
1 - 2: unknown
1 - 3: (null)
Моя проблема заключается в том, что пустое пространство.Я не могу сказать, откуда он исходит, и независимо от того, что я делаю, он появляется.
Из того, что я могу сказать, это может быть символ \ n в конце строки или что-то еще, но передача этогов execvp
, поскольку execvp(args[0],args)
создает ошибку, поскольку она интерпретирует эту пустую строку как аргумент "".
Есть закомментированная строка, которая является просто строковым присваиванием в начале main
.Если вместо fgets
используется это назначение, программа работает, и я получаю желаемый ввод:
COMMANDER>some sentence unknown
1 - 0: some
1 - 1: sentence
1 - 2: unknown
1 - 3: (null)
Спасибо за чтение.Я немного заржавел на своем С, поэтому я несколько часов занимался этим самостоятельно и все еще не мог найти решение.