Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++_String - Fatal编程技术网

C++ 函数返回空字符串

C++ 函数返回空字符串,c++,string,C++,String,在下面的代码reverse中,函数重新返回一个空字符串。没有编译错误 是什么导致了这里的问题 #include <iostream> #include <bits/basic_string.h> using namespace std; string reverse(string str) { string r; for (int i=str.length()-1; i>=0; i--) { r[str.length() - 1

在下面的代码
reverse
中,函数重新返回一个空字符串。没有编译错误

是什么导致了这里的问题

#include <iostream>
#include <bits/basic_string.h>
using namespace std;

string reverse(string str) { 
    string r;

    for (int i=str.length()-1; i>=0; i--) {
        r[str.length() - 1 - i] = str[i];  
    }

    return r;
} 

int main() {
    string str = "ABCDefgh";

    cout<<"Reverse string is : "<<reverse(str)<<endl;

    return 0;
}
#包括
#包括
使用名称空间std;
字符串反转(字符串str){
字符串r;
对于(int i=str.length()-1;i>=0;i--){
r[str.length()-1-i]=str[i];
}
返回r;
} 
int main(){
string str=“ABCDefgh”;

cout您的函数正在调用未定义的行为,因为在使用
[]字符串之前,您没有为
r
字符串分配任何内存
运算符将字符分配给
r
。不执行任何边界检查,因此您实际上破坏了周围的内存。此外,您也没有正确地将索引编入
r
(您的索引已关闭1)

如果您使用该方法而不是
操作符[]
,它将引发运行时异常,抱怨您访问了超出范围的字符

您需要先复制输入的
str
,然后才能反转该副本的字符,例如:

std::string reverse(std::string str) { 
    std::string r = str; // <-- COPY HERE

    for (int i = str.length()-1, j = 0; i >= 0; --i, ++j) {
        r[j] = str[i];  
    }

    return r;
} 
或者,您可以改为使用该方法(可选地与该方法一起使用,以避免在推送时重新分配):

或者,看看算法:

#include <algorithm>

std::string reverse(std::string str) { 
    std::string r;
    r.resize(str.length());
    std::reverse_copy(str.begin(), str.end(), r.begin());
    return r;
} 
#include <algorithm>

std::string reverse(std::string str) { 
    std::reverse(str.begin(), str.end());
    return str;
} 

您需要为
r
分配空间,其长度为0。为什么
而不是
?“没有编译错误…”
r[str.length()-i]=str[i];
“在分配长度之后它工作得很好。我是否总是需要为字符串声明长度?字符串在C++中的行为是否不同于它在PHP或JavaScript中的行为?我要比昆比稍微远一点。不要从比特文件夹中包含任何东西。比特的每一个都是具体实现的,并打算包含在一个更高级别的报头。实现细节可以在没有警告的情况下改变,并且在所有C++实现中都不可能实现,在没有被更高级的报头所包含的情况下,位中的报头可能会发生故障,因为假定由高级报头执行的某些设置可能没有蜂。n已执行。这是传递值,所以您甚至不需要制作副本-您已经有了副本。您甚至不需要
std::reverse()
只需要一行
return std::string(str.rbegin(),str.rend());
就可以了
#include <algorithm>

std::string reverse(std::string str) { 
    std::string r;
    r.resize(str.length());
    std::reverse_copy(str.begin(), str.end(), r.begin());
    return r;
} 
#include <algorithm>
#include <iterator>

std::string reverse(std::string str) { 
    std::string r;
    r.reserve(str.length()); // <-- OPTIONAL
    std::reverse_copy(str.begin(), str.end(), std::back_inserter(r));
    return r;
} 
std::string reverse(std::string str) { 
    int count = str.length() / 2;
    for (int i = 0, j = str.length()-1; i < count; ++i, --j) {
        char ch = str[i];
        str[i] = str[j];
        str[j] = ch;

        // alternatively:
        // std::swap(str[i], str[j]);
    }

    return str;
} 
#include <algorithm>

std::string reverse(std::string str) { 
    std::reverse(str.begin(), str.end());
    return str;
} 
std::string reverse(std::string str) { 
    return std::string(str.rbegin(), str.rend());
}