代码中的运行时错误

时间:2013-10-04 16:56:15

标签: c++

在以下程序中旋转字符串运行时发生错误。请帮助

代码中没有编译错误

#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;
}

3 个答案:

答案 0 :(得分:8)

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

请尝试例如

char str[] = "abcde";
rotateString(str, 2);

答案 1 :(得分:1)

你在这里传递一个字符串文字:

rotateString("abcde",2);

然后尝试修改它,这是undefined behavior2.14.5 字符串文字部分中的C ++草案标准说(强调我的):

  

是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的。 尝试修改字符串文字的效果未定义。

另一方面,此代码将用于调用未定义的行为:

char arr[] = "abcde" ;
rotateString(arr,2);

答案 2 :(得分:0)

 rotateString("abcde",2);

您正在将String Literal(这是一个const)传递给rotateString()。实际上编译器会创建一个恒定的temprory字符串变量/ char []并将“abcde”存储在其中。将它传递给函数rotateString()。

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

解决方案:

Store "abcde" in a char[] and passing it to rotateString()