在c风格的字符串上运行时遇到exc_bad_access错误

时间:2013-10-02 16:39:58

标签: c++ c string exc-bad-access

我正在解决“用'%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字符串是危险的,但我不知道如何修改它......

任何解释或建议都将不胜感激!

1 个答案:

答案 0 :(得分:1)

好吧,如果原始缓冲区的长度不足以包含带有替换的字符串,那么您将访问内存超出范围。确定新大小后,可以执行realloc调用以重新分配大小为newlen的足够缓冲区,如*s = realloc(*s, newsize)。唯一的问题是您需要将参数从char* s更改为char** s,以便在realloc将内存移动到另一个块时更新指针。当然,这将适用于在堆上分配的字符串,而不是本地堆栈字符串,因为您无法重新分配它。