2012-07-21 80 views
1

我正在嘗試編寫一個C++函數,該函數將包含URL的std::string拆分爲其組件。我需要將這些組件複製到這個結構:將std :: string的一部分複製到另一個未初始化的字符串

typedef struct urlstruct { 
    string protocol; 
    string address; 
    string port; 
    string page; 
} urlstruct; 

這是迄今爲止功能:

int parseAnnounce2(string announce, urlstruct *urlinfo){ 
    int i; 

    if(announce.find("://") != string::npos){ 
     // "://" found in string, store protocol 
     for(i = 0; i < announce.find("://"); i++){ 

     } 
    } else { 
     // No "://" found in string 
    } 

    return 0; 
} 

我需要在之前的字符複製「://」序列到urlinfo->協議字符串。這樣做的好方法是什麼?

我知道我不能使用下面的代碼行來分配它,因爲協議字符串尚未初始化爲包含該內存。

urlinfo->protocol[i] = announce[i]; 

回答

5

使用std::string::assign。這應該工作:

if (announce.find ("://") != std::string::npos) 
    urlinfo->protocol.assign (announce, 0, announce.find ("://")); 
else 
    //not found, handle 

或者,如果你想要的find結果存儲在一個變量不計算/輸入兩次,你可以做到這一點:

std::string::size_type foundPos = announce.find ("://"); 
if (foundPos != std::string::npos) 
    urlinfo->protocol.assign (announce, 0, foundPos); 
else 
    //not found, handle 
+2

通過將值存儲在變量中,可以消除對std :: string :: find()的重複調用。 – 2012-07-21 17:06:11

+0

@代碼大師,你可以,是的。不過,我認爲編譯器會照顧到這一點。 – chris 2012-07-21 17:07:38

+0

@ Code-Guru,那裏,開心? :p – chris 2012-07-21 17:10:36

2

std::string::insert應該做的這裏的工作:

size_t pos = announce.find("://"); 
if(pos != std::string::npos) 
{ 
    protocol.insert(0, announce, 0, pos); 
} 
相關問題