代码中的运行时错误

Runtime error in the code

本文关键字:运行时错误 代码      更新时间:2023-10-16

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

代码中没有编译错误

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

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

尝试例如

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

您在此处传递字符串文字:

rotateString("abcde",2);

并随后尝试修改它,这是未定义的行为。2.14.5 字符串文字部分中的C++标准草案说(强调我的):

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

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

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

你正在传递一个字符串文字(这是一个const)来rotateString()。实际上,编译器会创建一个常量临时字符串变量/char[],并将"abcde"存储在其中并将其传递给函数rotateString()。

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

溶液:

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