Почему моя функция удаления подстроки выводит неверный результат?

Функция должна удалять подстроку из строки , начало и конец включительно , подскажите пожалуйста в чем ошибка , при строчке 1234567890 выводит 1234

char* strdel1(char* str, int p, int k) 
{
    if ((p <= 0) || (k < 0)) 
        return str;
    int size = strlen(str);
    if (k >= size) 
        return str;
    if(k+p >= size)
    {
        str[k] = 0;
        return str;
    }
    for (int i = k-1; i < size-k-2; i++)
    {
        str[size - k - 2] = str[k]; 
        k++;
    }
    str[size - k] = 0;
    return str;
}

Функция при вводе строки 1234567890,3,6(3 и 6 это начало и конец) выводит строчку 1234 ,а должна выводить 127890. Функция должна удалять включительно слева и справа p -начальная позиция , k- конечная

Исправил код:

if ((p <= 0) || (k < 0)) return str;
    int size = strlen1(str);
    if (k > size) return str;
    //if(k+p >=size)
    //{
    //  str[k] = 0;
    //  return str;
    //}
    for (int i = k; i < size-1; i++)
    {
        str[i-p-1] = str[i];
    }
    //str[k] = 0;
    return str;

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

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

Попробуйте так:

char* strdel1(char* str, int p, int k) 
{
    if (p <= 0 || k < p ) return str;
    if (k > strlen(str)) k = strlen(str);
    while(str[p++ -1] = str[k++]);
    return str;
}

Только учтите, что вы почему-то нумеруете символы в строке, начиная с 1, в то время как в С/С++ принята нумерация с 0. Но, хозяин-барин, сделал по вашему заказу :)

→ Ссылка
Автор решения: V-Mor

Раз уж вопрос (даже до моей правки) звучал как "почему не работает?", я постараюсь расписать причины:

  1. Третья проверка (if(k+p >= size) и т.д.). Здесь зачем-то проверяется сумма позиций на предмет выхода за длину строки. Но ведь я преспокойно могу взять подстроку между 7ым и 9ым символом строки, содержащей 10 символов. А эта функция в таком случае вернёт мне символы с 0ого по 6ой... Явно что-то не то.
  2. Далее цикл... Сложно сказать, что именно там неверно, т.к. мне абсолютно не ясна задумка автора, но я всё же попробую:

Представьте, что k у Вас равен 9 в той же самой стоке из 10 символов. Что происходит в цикле: Вы начинаете цикл с i = 8 и продолжаете, пока i не станет 10 - 9 - 2 = -1. При этом наращиваете i (i++). Как Вы думаете, станет ли когда-нибудь i равно -1, если Вы каждый раз прибавляете к нему 1, а изначально оно было равно 8? На самом деле, конечно, станет, но это уже другая история. Проблема здесь в том, что логика очень и очень хромает.

Я мог бы продолжить свои разглагольствования о том, почему данный код не работает, но сдаётся мне, что, т.к. @Harry уже предложил как реализовать то же самое гораздо проще, необходимость в этом отпадает.

→ Ссылка