在 C 样式字符串上操作时遇到exc_bad_access错误

meet exc_bad_access errror when operating on c-style string

本文关键字:exc bad access 错误 遇到 样式 字符串 操作      更新时间:2023-10-16

>我正在解决一个"用'%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将内存移动到另一个块时更新指针。当然,这将适用于在堆上分配的字符串,而不是本地堆栈字符串,因为您无法重新分配它。