0

次のプログラムで文字列をローテーションすると実行時エラーが発生します。助けてください

コードにコンパイル エラーがない

#include <iostream>
#include <cstring>

using namespace std;

void reverseString(char* str, int start, int end)
{
    int front = start;
    int back = end;
    while (front < back)
    {
        /* swap two variables without
        using a temporary one.*/
        str[front] ^= str[back];
        str[back]  ^= str[front];
        str[front] ^= str[back];
        ++front;
        --back;
    }
    return;
}

この部分は弦を回転させるためのものです

void rotateString(char* str, int k)
{
    if (!str || !*str)
        return;
    int len = strlen(str);
    /*Rotating a string by it's length is string itself.*/
    k %= len;
    reverseString(str, 0, len-1);
    reverseString(str, 0, k-1);
    reverseString(str, k, len-1);
    cout<<str;
    return;
}

int main() {
    rotateString("abcde",2);
    return 0;
}
4

3 に答える 3

8

これは、リテラル文字列を変更しようとしたためです。すべてのリテラル文字列は定数であり、読み取り専用です。1 つを変更しようとすると、未定義の動作が発生し、動作しているように見えたり、クラッシュしたりすることがあります。

代わりに試してください。

char str[] = "abcde";
rotateString(str, 2);
于 2013-10-04T16:57:26.833 に答える
1

ここで文字列リテラルを渡しています。

rotateString("abcde",2);

その後、それを変更しようとすると、これは未定義の動作です。2.14.5 セクション文字列リテラルのC ++ドラフト標準は次のように述べています(強調鉱山):

すべての文字列リテラルが異なる (つまり、重複しないオブジェクトに格納される) かどうかは、実装で定義されます。文字列リテラルを変更しようとした場合の影響は未定義です。

一方、このコードは未定義の動作を呼び出して機能します。

char arr[] = "abcde" ;
rotateString(arr,2);
于 2013-10-04T17:01:35.777 に答える
0
 rotateString("abcde",2);

文字列リテラル(const)をrotateString()に渡しています。実際、コンパイラは定数一時文字列変数/ char[] を作成し、その中に「abcde」を格納して、それを関数 rotateString() に渡します。

const を編集/変更できないため、エラーが発生しています。

解決:

Store "abcde" in a char[] and passing it to rotateString()
于 2013-10-04T17:00:09.580 に答える