Я думаю, что ответ на ваш вопрос на самом деле довольно прост, но я предполагаю, что другие ответы приняли другой. Я предполагаю, что вы хотите, чтобы любой блок текста, заключенный в кавычки, выделялся сам по себе независимо от пробелов, а остальная часть текста разделялась пробелами.
Итак, приведенный пример:
"некоторый текст в кавычках" плюс четыре простых слова p "lus нечто странное"
Вывод будет:
[0] текст в кавычках
[1] плюс
[2] четыре
[3] просто
[4] слова
[5] p
[6] Лус что-то странное
Учитывая, что это так, требуется только простой фрагмент кода и никаких сложных машин. Сначала вы проверите, есть ли начальная кавычка для первого символа, и если это так, отметьте флаг и удалите этот символ. А также удаление любых кавычек в конце строки. Затем токенизируйте строку на основе кавычек. Затем токенизируйте все остальные строки, полученные ранее пробелами. Токенизация начинается с первой строки, полученной, если не было лидирующей кавычки, или второй строки, полученной при наличии лидирующей кавычки. Затем каждая из оставшихся строк из первой части будет добавлена в массив строк, перемежающихся со строками из второй части, добавленными вместо строк, из которых они были размечены. Таким образом, вы можете получить результат, указанный выше. В коде это будет выглядеть так:
#include<string.h>
#include<stdlib.h>
char ** parser(char * input, char delim, char delim2){
char ** output;
char ** quotes;
char * line = input;
int flag = 0;
if(strlen(input) > 0 && input[0] == delim){
flag = 1;
line = input + 1;
}
int i = 0;
char * pch = strchr(line, delim);
while(pch != NULL){
i++;
pch = strchr(pch+1, delim);
}
quotes = (char **) malloc(sizeof(char *)*i+1);
char * token = strtok(input, delim);
int n = 0;
while(token != NULL){
quotes[n] = strdup(token);
token = strtok(NULL, delim);
n++;
}
if(delim2 != NULL){
int j = 0, k = 0, l = 0;
for(n = 0; n < i+1; n++){
if(flag & n % 2 == 1 || !flag & n % 2 == 0){
char ** new = parser(delim2, NULL);
l = sizeof(new)/sizeof(char *);
for(k = 0; k < l; k++){
output[j] = new[k];
j++;
}
for(k = l; k > -1; k--){
free(new[n]);
}
free(new);
} else {
output[j] = quotes[n];
j++;
}
}
for(n = i; n > -1; n--){
free(quotes[n]);
}
free(quotes);
} else {
return quotes;
}
return output;
}
int main(){
char * input;
char ** result = parser(input, '\"', ' ');
return 0;
}
(не может быть идеальным, я не проверял)