在 C 样式字符串上操作时遇到exc_bad_access错误
meet exc_bad_access errror when operating on c-style string
>我正在解决一个"用'%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] = ' ';
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] = ' ';
中有一个"线程:exc_bad_access"错误.我知道以这种方式操作 c-stye 字符串很危险,但我不知道如何修改它......
任何解释或建议将不胜感激!
好吧,如果原始缓冲区不够长,无法包含带有替换的字符串,那么您正在越界访问内存。当您确定新大小时,您可以执行 realloc 调用以重新分配大小newlen
的足够缓冲区,如 *s = realloc(*s, newsize)
。唯一的问题是您需要将参数从 char* s
更改为 char** s
,以便在realloc
将内存移动到另一个块时更新指针。当然,这将适用于在堆上分配的字符串,而不是本地堆栈字符串,因为您无法重新分配它。
相关文章:
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- 将 lambda 传递给 STL 集时出错"bad function call"
- 新的 C++14 位分隔符处"Bad Character" Eclipse Oxygen 错误
- 使用 #define 被认为是"bad practice"吗?
- "400 Bad request"使用 OpenSSL BIO 进行请求时
- 解密文件AES_256_CBC返回"bad decrypt"错误
- 在C++流中,eof(),fail(),bad()和good()有什么区别
- make / gcc:"bad build"的可能原因是什么?
- 什么是地址0xbaddc0dedeadbead "Bad decode dead bead"
- 在多线程环境中,什么可能导致"bad file descriptor"?
- "std::vector"在调整大小时引发"bad allocation"异常
- 尝试使用 execp、dup2 和管道实现 shell,挂起或"bad file descriptor"
- OpenCV SVM 在火车上抛出异常,"Bad argument (There is only a single class)"
- 成员函数 bad() 的 std::ftsream 用于检查
- 使用 boost::asio 和 boost::thread 时"Bad file descriptor"
- OpenCV C++神经网络 predict() 函数抛出"Bad argument"错误