Если вы ищете способ разобрать входную строку и отделить ее от некоторых аргументов в C, я нашел это (отсюда example for fork()
). Я (по крайней мере думаю) действительно понимаю большую часть этого, но у меня действительно есть проблемы в понимании, почему работает *arguments++ = token;
. Если я прав, arguments
должен быть указателем на массив указателей. И token
указатель на строку ввода. Поэтому, когда цикл while имеет самую первую итерацию, он пропускает первый цикл while, потому что token
не указывает на какие-либо пробелы.Что именно происходит в этой функции синтаксического анализа?
И теперь идет часть, которая меня смущает: arguments
получает адрес token
указывает на и затем увеличивается. Хорошо. Но разве это не означает, что первый указатель в этом массиве указателей теперь указывает на полную строку "abc def ghi"
?
На данном сайте картина, и я всегда думал, что "abc def ghi"
должен быть на позиции 0, но только abc
есть (это хорошо и полностью является то, что я хочу). Как code make make так arguments[0]
содержит "abc"
, а не "abc def ghi"
?
Что я пропущу или ошибаюсь? Может кто-нибудь меня уладил? Запутанным код ниже:
#include <stdio.h>
#include <stdlib.h`enter code here`>
void parse_cmd(char *token, char **arguments)
{
while (*token != '\0') {
while (*token == ' ' || *token == '\0' || *token == '\n')
*token++ = '\0';
/* What exactly is happening here and why does it work? */
*arguments++ = token;
while (*token != ' ' && *token != '\0' && *token != '\n'){
token++;
}
}
*arguments = '\0';
}
int main(void)
{
int i = 0;
int j = 0;
char *arguments[64];
char input[] = "abc def ghi";
parse_cmd(input, arguments);
while(arguments[i] != '\0'){
while (arguments[i][j] != '\0'){
printf("%c", arguments[i][j]);
j++;
}
puts("");
j = 0;
i++;
}
return 0;
}
Об этом можно очень быстро ответить в отладчике – KevinDTimm
Вопрос был похоронен в кучу прозы, но никогда не был непонятен. Я переформатировал исходный вопрос, чтобы подчеркнуть его, и повторил его в пункте ниже, а также удалил красную селедку в заголовок вопроса. – jxh
@jxh thx для редактирования - вы выделили текст, это были два момента, которые беспокоили меня, особенно последний. – Faulek