2013-10-02 66 views
1

我有一個函數將一個指向字符串的指針作爲參數。我想找到該字符串的子字符串,但我嘗試使用使用*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); 
} 

以上是代碼的一部分。的運算符優先級規則

回答

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

這是由於operator precedence。元素選擇操作.比引用操作*更高的優先級,所以編譯器實際上把它看作

*(str.substr(...)) 

有解決這幾個方面。我建議的一個是不使用指針,而是引用而不是參數。那麼你不必擔心解引用或可能的空指針。如果你不想修改原始字符串,那麼就是一個常量引用。

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

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

    // ... 
} 

然後調用它無需操作員的地址的

std::string str = ...; 
foo(str);