LINUX.ORG.RU

История изменений

Исправление Puzan, (текущая версия) :

Выложу-ка и я свой вариант. Вариант совсем не использует библиотечные вызовы. Готов к включению в общую тестилку.

char* str_drop_str(char* str, char* sub)
{
    char* p_dst = str;
    char* p_src = str;
    char src;

    char* p_sub = sub;
    int sub_len = 0;

    int delim = 1;

    do {
        src = *p_src;
        
        if (!*p_sub && (src == ' ')) {
            p_dst -= sub_len;
            p_sub = sub;
            sub_len = 0;
        } else
            if (delim && (src == *p_sub)) {
                p_sub ++;
                sub_len ++;
            } else {
                delim = (src == ' ') ? 1 : 0;
                p_sub = sub;
                sub_len = 0;
            }

        if (p_dst != p_src)
            *p_dst = src;

        p_src ++;
        p_dst ++;

    } while(*p_src);

    if (!*p_sub) p_dst -= sub_len;
    
    *p_dst = 0;

    return str;
}

Можно наверное пооптимизировать слегка.

Исходная версия Puzan, :

Выложу-ка и я свой вариант. Вариант совсем не использует библиотечные вызовы. Готов к включению в общую тестилку.

char* str_drop_str(char* str, char* sub)
{
    char* p_dst = str;
    char* p_src = str;
    char src;

    char* p_sub = sub;
    int sub_len = 0;

    int delim = 1;

    do {
        src = *p_src;
        
        if (!*p_sub && (src == ' ')) {
            p_dst -= sub_len;
            p_sub = sub;
            sub_len = 0;
        } else
            if (delim && (src == *p_sub)) {
                p_sub ++;
                sub_len ++;
            } else {
                delim = (src == ' ') ? 1 : 0;
                p_sub = sub;
                sub_len = 0;
            }

        if (p_dst != p_src)
            *p_dst = src;

        p_src ++;
        p_dst ++;

    } while(*p_src);

    if (!*p_sub) p_dst -= sub_len;
    
    *p_dst = 0;

    return str;
}