1

我有一个函数,它将指向字符串的指针作为参数。我想找到该字符串的子字符串,但我尝试使用 use*str.substr()但它说我正在尝试调用成员函数substr()并且str不是类std:string*我该怎么办?

#include <string>
using namespace std;

int main() {
     string str;
     foo(&str);
}

void foo(string *str){
     string temp = *str.substring(int, int);
}

以上是代码的精华。

4

2 回答 2

3

您违反了运算符优先级规则,这意味着您的代码被读取为

*(str.substring(int, int));

您可以使用指针取消引用运算符->

str->substring(a, b);

或使用括号明确说明您想要什么

(*str).substring(int, int);

除非参数可以为空,否则更简单的解决方案是传递一个引用:

foo(const std::string& str){
     std::string temp = str.substring(a, b);
}
于 2013-10-02T05:47:01.067 回答
1

这是由于运算符优先级。元素选择运算符.的优先级高于取消引用运算符*,因此编译器实际上将其视为

*(str.substr(...))

有几种方法可以解决这个问题。我建议不要使用指针,而是使用引用来代替参数。然后您不必担心取消引用或可能的空指针。如果您不想修改原始字符串,则使用常量引用。

喜欢

void foo(const std::string& str)
{
    // ...

    std::string temp = str.substr(...);

    // ...
}

然后在没有地址运算符的情况下调用它

std::string str = ...;
foo(str);
于 2013-10-02T05:47:51.177 回答