Почему моя функция удаления подстроки выводит неверный результат?
Функция должна удалять подстроку из строки , начало и конец включительно , подскажите пожалуйста в чем ошибка , при строчке 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 шт):
Попробуйте так:
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. Но, хозяин-барин, сделал по вашему заказу :)
Раз уж вопрос (даже до моей правки) звучал как "почему не работает?", я постараюсь расписать причины:
- Третья проверка (
if(k+p >= size)и т.д.). Здесь зачем-то проверяется сумма позиций на предмет выхода за длину строки. Но ведь я преспокойно могу взять подстроку между 7ым и 9ым символом строки, содержащей 10 символов. А эта функция в таком случае вернёт мне символы с 0ого по 6ой... Явно что-то не то. - Далее цикл... Сложно сказать, что именно там неверно, т.к. мне абсолютно не ясна задумка автора, но я всё же попробую:
Представьте, что k у Вас равен 9 в той же самой стоке из 10 символов. Что происходит в цикле: Вы начинаете цикл с i = 8 и продолжаете, пока i не станет 10 - 9 - 2 = -1. При этом наращиваете i (i++). Как Вы думаете, станет ли когда-нибудь i равно -1, если Вы каждый раз прибавляете к нему 1, а изначально оно было равно 8? На самом деле, конечно, станет, но это уже другая история. Проблема здесь в том, что логика очень и очень хромает.
Я мог бы продолжить свои разглагольствования о том, почему данный код не работает, но сдаётся мне, что, т.к. @Harry уже предложил как реализовать то же самое гораздо проще, необходимость в этом отпадает.