0

我正在解决一个“用'%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;
        }
    }
}

而且我在该行中有一个“线程:exc_bad_access”错误s[newlen] = '\0';。我知道以这种方式操作 c-stye 字符串很危险,但我不知道如何修改它......

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

4

1 回答 1

1

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

于 2013-10-02T17:36:25.917 回答