встречайте ошибку exc_bad_access при работе со строкой в ​​стиле c

Я решаю проблему, которая «заменяет все пробелы в строке на«% 20 ». и я хочу работать с исходной строкой, а не создавать новую строку. Вот мой код:

void replaceSpaces(char* s, int len) {

int spaceCnt = 0;

for(int i = 0; i < len; ++i) {
if(s[i] == ' '){
++spaceCnt;
}
}

int newlen = len + 2 * spaceCnt;

s[newlen] = '\0';

for(int i = len - 1; i >= 0; --i) {
if(s[i] == ' ') {
s[newlen - 1] = '0';
s[newlen - 2] = '2';
s[newlen - 3] = '%';
newlen -= 3;
} else {
s[newlen - 1] = s[i];
--newlen;
}
}
}

И у меня есть ошибка «thread: exc_bad_access» в строке s[newlen] = '\0';, Я знаю, что так опасно работать со строкой c-stye, но я не знаю, как ее изменить …

Любые объяснения или предложения будут оценены!

0

Решение

Что ж, если исходный буфер недостаточно длинный, чтобы содержать строку с заменами, вы получаете доступ к памяти за пределами. Когда вы определите новый размер, вы можете сделать перераспределить вызов перераспределить достаточный буфер с размером newlen лайк *s = realloc(*s, newsize), Единственная проблема заключается в том, что вам нужно изменить параметр из char* s в char** s так что если realloc перемещает память в другой блок, вы обновляете указатель. И, конечно, это будет работать со строками, расположенными в куче, а не со строками локального стека, поскольку вы не можете перераспределить это.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector