C++ 代码中的运行时错误
在下面的程序中旋转字符串运行时出错。请帮助 代码中没有编译错误C++ 代码中的运行时错误,c++,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
#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;
}
#包括
#包括
使用名称空间std;
无效反向字符串(字符*str,整数开始,整数结束)
{
int front=开始;
int back=end;
while(前<后)
{
/*交换两个变量
使用临时的*/
str[front]^=str[back];
str[后]^=str[前];
str[front]^=str[back];
++前线;
--背部;
}
返回;
}
这部分是用来旋转绳子的
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;
}
void rotateString(char*str,int k)
{
如果(!str | |!*str)
返回;
int len=strlen(str);
/*按长度旋转字符串就是字符串本身*/
k%=len;
反向限制(str,0,len-1);
反向限制(str,0,k-1);
反向限制(str,k,len-1);
cout这是因为您试图修改一个文本字符串。所有文本字符串都是常量和只读的。试图修改一个文本字符串会导致未定义的行为,这有时似乎有效,有时会崩溃
试试看
char str[] = "abcde";
rotateString(str, 2);
您正在向rotateString()传递一个字符串文字(常量)。实际上,编译器生成一个常量temprory字符串变量/char[],并在其中存储“abcde”,并将其传递给函数rotateString()
由于无法编辑/修改常量,这就是为什么会出现错误
解决方案:
您正在此处传递字符串文字:
rotateString("abcde",2);
并随后尝试修改它,这是C++的草稿标准在章节<代码> 2.145< /COD>字符串文字中说:(强调雷):
是否所有字符串文字都是不同的(即存储在非重叠对象中)由实现定义。尝试修改字符串文字的效果未定义。
另一方面,此代码将用于调用未定义的行为:
char arr[] = "abcde" ;
rotateString(arr,2);
这不是答案,而是可读性/可感知性的提高:str[front]^=str[back];
这不是40分钟前没有问过的问题。有趣的是,“abcd”的类型是char const[6]
。它被传递给一个接受char*
的函数……啊,原来C++03允许将字符串文字解释为char*
:“一个不是宽字符串文字的字符串文字(2.13.4)可以转换为“指向字符的指针”类型的右值。”;宽字符串文字可以转换为类型为“指向wchar__t的指针”的右值。在这两种情况下,结果都是指向数组第一个元素的指针。只有在存在明确的适当指针目标类型时,才考虑此转换,而不是在通常需要从左值转换为右值时。[注意:此转换已弃用。请参见附录D]“@IgorR.gcc
和clang
将发出警告,但这是为了保持与C的兼容性,因为字符串文字是char[]
在C.Yes中。但是在AFAIR中,C++11放弃了这种兼容性,并且不允许这种隐式转换。@IgorR。C++11模式中的gcc
和clang
都允许这样做,并警告说它已贬值……尽管您总是可以将警告视为错误。
rotateString("abcde",2);
char arr[] = "abcde" ;
rotateString(arr,2);