将字符串拆分为令牌,忽略包含在""中的子串。

时间:2018-06-09 01:57:19

标签: c string substring strtok

我正在创建自己的命令行解析器,我正在使用strok()分隔子串和\t(空格)的分隔符

但是,如果子字符串包含在\"中,则不应拆分其内容,因为子字符串需要自由包含空格字符。

是否有任何已知功能或简单方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

我很优雅地以优雅的方式去做,所以我只是以懒惰的方式做到了。 这是最丑陋的功能:

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