1

我试图rtrim()在不使用算法的情况下使用 c++ 中字符串头中的函数来修剪字符串。
我所做的是通过是否存在空间来检查开始和结束位置,只需使用将其删除,isspace()但是当我编译时,现在出现此错误:

从 'const char*' 类型的右值对类型 'std::string& {aka std::basic_string&}' 的非常量引用的无效初始化</p>

这是我的代码:

#include <iostream>
#include <string>
using namespace std;

string rtrim(string& s) {
    size_t i;
    for(i = s.length() - 1; i != (size_t)-1; i--) {
        if(!(isspace(s[i]))){
            break;
        }
    }
    return s.substr(0, i + 1);
}

int main(){
    cout << "|" << rtrim("   hello world\t ") << "|" << endl;
}

每当我设置诸如string s = ( "hello world\t ");和运行之类的参数时,cout << rtrim(s) << endl;它似乎正在工作,但它不像上面的代码那样工作。有什么建议么?

4

1 回答 1

0

上面的代码将std::string在堆栈上创建临时对象并将其作为非常量引用传递给函数。这是危险的,因为该函数可能会修改对象(这没有意义)或记住对该对象的引用,并在对象已被销毁后尝试将其修改超出其范围。

在您的函数中,您实际上不需要non-const参考,因此只需将参数更改为即可const std::string &s

于 2016-01-28T11:22:09.653 回答