2017-06-24 7 views
-1
char removeSpaces(char* str) 
{ 
    if (str == NULL) 
     return '\0'; 

    int i = 0, j = 0; 

    while (str[i] != '\0') 
    { 
     while (str[i] == ' ') 
      i++; 
     str[j++] = str[i++]; 
    } 
    str[j] = '\0'; 
    return str[0]; 
} 

コンパイラのコードを実行する際に問題はありません。私がビジュアルスタジオでそれを実行しようとしているとき、私は問題に直面しています。文字列を使用したスタックベースのバッファオーバーランの例外

テストケースは、緑のチェックで通過されるが、それは後に中止され、メッセージが表示されては:

The active Test Run was aborted because the execution process exited unexpectedly. To investigate further, enable local crash dumps either at the machine level or for process vstest.executionengine.x86.exe. 

Iは、テストケースをデバッグし、それが示す:

未処理の例外をvstest.executionengine.x86.exeの0x627B1B69(spec.dll)にあります。スタッククッキーインストルメンテーションコードがスタックベースのバッファーオーバーランを検出しました。

この例外のハンドラがある場合は、プログラムを安全に続行することができます。

誰でもこれを説明できますか?

+0

これはC++ではないC# – Jimbot

+0

わからないですそれはあなたの問題に関連しているが、charSpace()を宣言してstr [0]を返している場合。それをchar *宣言してstrを返すのはなぜですか?その戻り値を使用するかどうかに応じて、問題が発生する可能性があります。 –

+0

私は戻り値を使用していません。これはnullの場合のみ使用されます。 –

答えて

0

スペースをスキップし、内部ループは'\0'を打つことができ、及びi++(割り当てで)した後、外側ループはもはやそれを見ないであろう、そして'\0'後走査を継続します。これは、文字列に末尾のスペースが含まれている場合に発生します。あなたは()ループを使用して、1行にループロジックを集中させることによって簿記エラーのこの種のを避けることができ



void squeezespace(char*string) 
{ 
size_t i,j; 

for(i=j=0; string[i]; i++) { // loop logic on one line 
     if(string[i] == ' ') continue; 
     string[j++] = string[i] ; 
     } 
string[j] = 0; 
} 
関連する問題