我正在解决“用'%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;
}
}
}
我在行s[newlen] = '\0';
中有一个“thread:exc_bad_access”错误。我知道以这种方式操作c-stye字符串是危险的,但我不知道如何修改它......
任何解释或建议都将不胜感激!
答案 0 :(得分:1)
好吧,如果原始缓冲区的长度不足以包含带有替换的字符串,那么您将访问内存超出范围。确定新大小后,可以执行realloc调用以重新分配大小为newlen
的足够缓冲区,如*s = realloc(*s, newsize)
。唯一的问题是您需要将参数从char* s
更改为char** s
,以便在realloc
将内存移动到另一个块时更新指针。当然,这将适用于在堆上分配的字符串,而不是本地堆栈字符串,因为您无法重新分配它。