Алгоритм разбивания строки на аргументы (с кодом)

Допустим у меня строка "ab\"c" "\\" d. Мне надо, чтобы она была разбита на элементы "ab"c", "\", "d".

Я посмотрел алгоритм на сайте майков, но хотелось бы сразу кодом


Ответы (1 шт):

Автор решения: KoVadim

Очень быстро пишется на коленке вот такое

Код в целом покоментированный. Да, код считает, что одно слово не будет длинее 1000 символов - мне лень было с realloc возиться. Также, функция просто печатает внутри найденное слово, а сама возвращает указатель на позицию, с которой нужно начать поиск следующего куска. В целом, если нужен другой интерфейс - переделывайте. В коде есть небольшое дублицирование, мне было лень выносить в отдельную функцию.

#include <stdio.h>
#include <memory.h>

const char* extract_word(const char* x)
{
    char word[1000] = {0};
    char* p = &word[0]; // здесь будет найденное слово без слешей и кавычек
    while (*x == ' ') { x++; } // пропустим пробелы
    if (*x == '\0') return NULL; // пришел конец строки
    if (*x == '"') { // парсим строку, которая начинается на кавычку
        x++; // пропустим ее
        while (*x != '\0' && *x != '"') { // пока не конец строки или не нашли кавычку
            if (*x == '\\') {
                x++; // пропустим слеш
            }
            *p++ = *x++; // скопируем символ
        } 
        if (*x == '\0') {puts("Строка кончилась, а кавычки нету");return NULL;} // ups
        x++;
        *p++ = '\0';
    } else {
        // а тут у нас слова, которые начинаются не с кавычки
        while (*x != '\0' && *x != ' ') {
            if (*x == '\\') {
                x++;
            }
            *p++ = *x++;
        }
        *p++ = '\0';
    }
    printf("нашли строку = %s\n", word);

    return x;
}

int main()
{
    const char* s = "\"ab\\\"c\" \"\\\\\" d";
    puts(s);
    const char* x = s;
    while (x) {
        x = extract_word(x);
    }
}
→ Ссылка