Обратите внимание, что
if(j > 0)
buffer[k] = buffer[k+2];
else
buffer[k] = buffer[k+2];
выполняет один и тот же код независимо от значения j
.Также обратите внимание, что j
никогда не может быть отрицательным в вашем коде в любом случае.
Вы выходите за пределы своего буферного массива.Ваш счетчик цикла i
увеличивается на единицу в конце каждого цикла, но вы также делаете
i = i - remainderOffset;
несколько раз в цикле k
.Конечно, это должно дать вам отрицательное значение i
?
Кроме того, когда вы сдвигаете буфер обратно с помощью
buffer[k] = buffer[k+2];
, цикл занимает k
до bufferLen
, поэтому k+2
здесь тоже за пределами
Я не уверен, почему вы все равно сдвигаете все назад на фиксированное количество двух позиций?Разумеется, это предполагает, что вы только что добавили однозначное число?
Подумайте об этих проблемах, и вы начнете понимать, в чем дело.Я согласен с другими, что если вы можете использовать существующий код, сделайте это.
Редактировать: В ответ на ваш комментарий
Я предполагаю, что это часть задания на хранениерезультат в буфере?Если нет, то просто следите за этим целым числом, и все значительно упрощается.Если в задании указано, что вы должны обновить буфер с промежуточными результатами, обратите внимание на следующее:
Предположим, что два числа в начале текущей позиции буфера называются A и B, а A - это двузначное число иB трехзначное число.Существует два возможных результата с точки зрения объема хранилища, необходимого для результата: R. Это либо
AA+BBB+remainder -> RRR+remainder
, либо
AA+BBB+remainder -> RRRR+remainder
Это означает, что у вас есть переменное смещениев зависимости от того, сколько цифр имеет результат, да, вы можете основывать его на resultLen
(но это не resultLen
само по себе).Обратите внимание, что если вы вернетесь назад, вам нужно заполнить пробелы, которые вы оставляете в конце буфера, подходящим символом или отследить, где теперь находится реальный конец буфера.
Вместо того, чтобы сдвигать остаток назадЯ бы оставил его там, где он есть, и записал бы результат в правильном месте перед ним (если, конечно, ваше задание явно не просит вас сдвинуть его назад).Таким образом, вы берете
AA+BBB
и конвертируете его в
...DDD
или
..DDDD
, где точки представляют символы, которые нам больше не нужны.символы не будут иметь значения, пока вы обновляете начальный индекс на каждой итерации цикла while
(избавьтесь от цикла i
).Если вы знаете количество цифр, которые есть у A, B и R, это не должно быть слишком сложным для вас.Наконец, вырвитесь из цикла while
, когда начальный индекс достигнет bufferLen
.