在以下程序中旋转字符串运行时发生错误。请帮助
代码中没有编译错误
#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;
}
答案 0 :(得分:8)
这是因为您尝试修改文字字符串。所有文字字符串都是常量且只读。尝试修改一个导致未定义的行为,这有时可能会有效并且有时会崩溃。
请尝试例如
char str[] = "abcde";
rotateString(str, 2);
答案 1 :(得分:1)
你在这里传递一个字符串文字:
rotateString("abcde",2);
然后尝试修改它,这是undefined behavior。 2.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()