2016-05-10 19 views
0

文字列内のすべてのスペースを '%20'で置き換える方法です。一般的にはうまく動作しますが、実行時に 'Run-Time Check Failure#2-S'で終了すると文句を言います。私のforループに問題はありますか?ランタイムチェック失敗2 - S、Visual Studio C++

void replaceSpace(char *s) { 
    int spaces = 0; 
    for (int i = 0; i < strlen(s); i++) { 
     if (s[i] == ' ') { 
      spaces++; 
     } 
    } 

    // new string that includes overwriting space, and two additional chars 
    int newLen = strlen(s) + spaces * 2; 

    s[newLen] = '\0'; 
    for (int i = strlen(s) - 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; 
     } 
    } 
} 




char test[] = "rep lace Spac e"; 
replaceSpace(test); 
cout << test << endl; //rep%20lace%20Spac%20e 

編集:私はcpp shellを介してこれを実行し、妙にすべての問題を持っていませんでした。うん、ビジュアルスタジオ2015を更新して、報告してください。

edit2:Nope、同じエラー。

+0

*見かけ上*未定義の動作の可能性の1つです。 –

答えて

1

あなたはtest

char test[] = "rep lace Spac e"; 

を定義するときは、(文字列の終端を忘れないでください)正確 16文字の配列を定義します。配列を展開する方法はありません。つまり、配列の境界から書き出し、の未定義の動作につながります。

解決策はもちろん、代わりにstd::stringを使用し、に追加することです。

+0

本当に他の方法はありませんか? Javaでの実装は問題ありませんでした。私はもちろんstd :: replaceを使うことができますが、私は実装を練習しています。 – blueman

+1

@mannerofallthings配列は固定サイズです。それだけです。文字列を(1つの文字を3つに置き換えるように)拡張したい場合は、標準の 'std :: string'クラスのような何らかの動的データ構造が必要です。 –

0

本当にこのコードは必要ありません。それを確認してください:

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <cctype> 

int main() 
{ 
    std::string s("rep lace Spac e"); 
    s.erase(std::remove_if(s.begin(), s.end(), static_cast<int(*)(int)>(std::isspace)), s.end()); 
    std::cout << s; 
} 
+0

この機能がどのように、なぜ必要なのか説明が必要な場合は、単に[Cargo Cult programming](https://en.wikipedia.org/wiki/Cargo_cult_programming) – user4581301

+0

OPにすべてのスペースを "%20"で置き換えてください。 –

関連する問題