Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 代码中的运行时错误_C++ - Fatal编程技术网

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