Я пытаюсь разбить строку на токены, чтобы создать массив параметров аргумента. Моя текущая реализация выглядит следующим образом (path
путь к пользовательским исполняемым файлам, для которых необязательных аргументы считываются):Разбор строки в токенах на C - что не так?
// ARG_MAX as defined in limits.h
int execute(char *exe) {
printf("args to %s: ", exe);
char *args = malloc(ARG_MAX);
scanf("%s", args);
char *argv[ARG_MAX];
int i = 0;
argv[i++] = exe;
while ((argv[i] = strsep(&args, " \t")) != NULL) {
i++;
}
free(args);
execv(exe, argv);
return 0;
}
Что меня смущает то, что от моего понимания strsep
это должно работать, как задумано, и в той степени, в которой при тестировании он точно выделяет tokens[0]
как path
, а tokens[1]
должен быть любым tokens_s
до первого символа пробела.
Если после пробела вы вводите другой аргумент, это не относится к tokens[2]
и т. Д. Для последующих аргументов.
Я не могу понять, что я делал неправильно при использовании strsep
, что не приводит к желаемой функциональности?
вход: exe = "/usr/bin/ps"
args = "-e -l"
выход: exec ps -e
'зсапЕ ("% S", арг);' не сохраняет ' '\ t'', ни пространства в' args'. Используйте 'fgets()'. Предложите опубликовать свой ввод. – chux
добавлен ввод. попробовали использовать 'fgets()', но в тот момент, когда мне нужно было ввести аргументы в командной строке, оно просто продолжается без подсказки? – transiti0nary
Поскольку этот пост не содержит полного компилируемого кода, он просто усложняет его работу. Добавление 'fgets()' вероятно, является проблемой, потому что другой код все еще использует 'scanf()'. Настоятельно рекомендуем опубликовать полный минимальный код, который показывает проблему. – chux