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

元のバッファが文字列を置換して格納するのに十分な長さでない場合、範囲外のメモリにアクセスしていることになります。新しいサイズを決定したら、reallocnewlen呼び出しを実行して、 のような サイズで十分なバッファーを再割り当てできます*s = realloc(*s, newsize)。唯一の問題は、メモリを別のブロックに移動する場合にポインターを更新char* sするように、パラメーターを から に変更する必要があることです。そしてもちろん、これはローカル スタック文字列ではなく、ヒープに割り当てられた文字列で機能します。これは再割り当てできないためです。char** srealloc

于 2013-10-02T17:36:25.917 に答える