Разбиение строки на токены без учета подстрок, заключенных в "" - PullRequest
0 голосов
/ 09 июня 2018

Я создаю свой собственный анализатор командной строки и разделяю подстроки с strok() и разделителями \t (пробелы)

Однако, если подстрока заключена в \", имеет смысл, чтоего содержимое не должно быть разделено, потому что подстроки должны свободно содержать пробельные символы.

Есть ли какая-либо известная функция или простой способ сделать это?

1 Ответ

0 голосов
/ 09 июня 2018

Мне было очень лениво делать это элегантным способом, поэтому я просто сделал это ленивым способом.Вот самая уродливая функция, которая работает:

char* foo (char* str)
{
    static char* p;
    int subcontainer = 0;
    int escBackslash = 0;
    int i = 0;
    if(p == NULL)
    {
        p = str;
        if(*p == '\\')
            escBackslash = 1;
    }
    char* offset = NULL;
    for(offset = p; *p != '\0'; p++)
    {
        if(*p == '\\')
        {
            escBackslash = 1;
            i = 1;
            continue;
        }
        if(*p == '"' && escBackslash == 0)
        {
            if(subcontainer < 1)
            {
                subcontainer = 1;
                offset++;
            } else subcontainer = -1;
        }
        if(isspace(*p) && subcontainer < 1)
        {
            if(i) *(p - 3) = '"';
            if(i) *(p - 2) = '\0';
            *(p-(-subcontainer)) = '\0';
            p++;
            return offset + i;
        }
        if(*(p+1) == '\0')
        {
            if(i) *(p - 2) = '"';
            if(i) *(p - 1) = '\0';
            if(subcontainer == -1) *p = '\0';
            p++;
            return offset + i;
        }
        escBackslash = 0;
    }
    return NULL;
}

Тестирование ..

int main()
{
    char* str = strdup("\"\\\"test\\\"\" + \"Command 2\" \"Command2\" function \"\\\"nice\\\"\"");

    printf("[%s]\n", str);

    char* str1 = foo(str);

    while(str1 != NULL)
    {
        printf("str[%s]\n", str1);

        str1 = foo(NULL);
    }

    free(str);
    return 0;
}

enter image description here

...