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

这是因为您尝试修改文字字符串。所有文字字符串都是常量且只读的。尝试修改一个会导致未定义的行为,这有时似乎有效,有时会崩溃。

尝试改为例如

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);

您正在将一个字符串文字(它是一个常量)传递给 rotateString()。实际上 Compiler 生成一个常量临时字符串变量/char[] 并将“abcde”存储在其中并将其传递给函数 rotateString()。

由于您无法编辑/修改 const,这就是您收到错误的原因。

解决方案:

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