Я решаю проблему, которая «заменяет все пробелы в строке на«% 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, но я не знаю, как ее изменить …
Любые объяснения или предложения будут оценены!
Что ж, если исходный буфер недостаточно длинный, чтобы содержать строку с заменами, вы получаете доступ к памяти за пределами. Когда вы определите новый размер, вы можете сделать перераспределить вызов перераспределить достаточный буфер с размером newlen
лайк *s = realloc(*s, newsize)
, Единственная проблема заключается в том, что вам нужно изменить параметр из char* s
в char** s
так что если realloc
перемещает память в другой блок, вы обновляете указатель. И, конечно, это будет работать со строками, расположенными в куче, а не со строками локального стека, поскольку вы не можете перераспределить это.
Других решений пока нет …