2011-03-30 75 views
1
大家

您好我有以下行:字符串連接點到另一個字符串的指針C++

string* playerInfo = "Name: " + firstName + " " + lastName + "\n" + 
         "Number: " + playerNumber + "\n" + 
         "Points: " + pointTotal + "\n"; 

哪裏名字,姓氏,playernumber,pointTotal都是字符串指針。

我怎樣才能把它們放到另一個字符串指針?編譯器抱怨我的代碼行。

對不起,我不擅長C++我來自Java背景。

+1

「對不起,我不擅長C++我來自Java背景。不過,這並不重要,因爲無論如何,你都應該從頭開始學習C++。看看[好書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list),忘記你瞭解Java;將相似性視爲巧合。 – GManNickG 2011-03-30 02:33:34

+0

不清楚'字符串指針'C字符串還是'std :: string'。 – Keith 2011-03-30 02:35:25

回答

7

使用較少的指針。如果你所有的變量都只是字符串,那就行得通了。但既然你說你有一個指針:

string playerInfo = "Name: " + *firstName + " " + *lastName + "\n" + 
        "Number: " + *playerNumber + "\n" + 
        "Points: " + *pointTotal + "\n"; 

一個從Java移動到C++與new創建所有的對象時,你應該打破第一個習慣。在C++中,new不用於創建對象,而是用於內存分配。任何時候你都可以使用本地變量而不是動態分配。如果不能,請嘗試讓一些庫提供的對象如std::vector負責爲您分配和取消分配。

1

Java背景是問題。

你不能在C++中做到這一點。指針指向內存中的地方。它們位於不同的位置,因此您不能將它們連接起來。

你爲什麼使用字符串指針?您可能會在char *指針和string之間產生混淆,其中is in the STL

你可能只是想使用字符串,沒有指針。你可以這樣做:

string str; 
str.append("Name: "); 
str.append(firstname); 
// ... 

你也可以使用+ =。

string str; 
str += " "; 
str += lastname; 

但是,這是令人困惑,因爲你不能做的:

string str; 
str += " " + " Name: "; // WRONG! 

但你可以這麼做:

string str; 
string str2; 
str = "Name: " + str2; // OK 

所以我只是避免了操作+和使用.append。


+2

'std :: string'重載'operator +',所以你可以連接它們。只要至少有一個參數是一個真正的'string'對象,那就是。 – 2011-03-30 02:32:58

+0

你確定嗎?我認爲它只是+ = ...(編輯nevermind,測試它,它的工作原理) – usul 2011-03-30 02:33:56

+1

@bo:是的,他是對的。常見的錯誤可能是:'const char * cstr =「asd」; std :: string s = cstr +「123」;'。在這裏,這個運算符重載不起作用,因爲'cstr'或'「123」'都不是'std :: string'。 – GManNickG 2011-03-30 02:35:26

1

你可能只想:

std::string playerInfo = std::string("Name: ") + firstName + " " + lastName + "\n" + 
       "Number: " + playerNumber + "\n" + 
       "Points: " + pointTotal + "\n"; 

"Name"std::string然後創建了一系列operator+()調用,進而產生級聯。

你可能並不真的需要playerInfo是在堆上,但如果這樣做,你可以有:

std::string* pOnHeap = new std::string(playerInfo); 
+0

不要告訴他新的,他會認爲他又回到了Java! – 2011-03-30 07:14:45

2

對於把一堆件這樣在一起,我會使用一個字符串流,是這樣的:

std::ostringstream buffer; 
buffer << "Name: " << firstName << " " << lastName << "\n" 
     << "Number: " << playerNumber << "\n" 
     << "Points: " << pointTotal << "\n"; 

std::string PlayerInfo = buffer.str(); 
0

像Coffin's先生回答使用 「字符串流」:

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

stringstream buffer;  
buffer << "Name: " << firstName << " " << lastName << "\n" 
     << "Number: " << playerNumber << "\n" 
     << "Points: " << pointTotal << "\n"; 

cout << buffer.str() << endl; 
0

至於你問通過使用指針解決您的問題這裏是一個元素的學校代碼解決方案:

int StringLength(const char * s){ 
int l = 0; 
while (*s++) l++; 
return l; 
} 

char *StrCat(const char * str1, const char *str2){ 
    int len1 = StringLength(str1); 
    int len2 = StringLength(str2); 
    int totLen = len1 + len2 + 1; 

    char * str12 = (char *)malloc((totLen)*sizeof(char)); 
    memset(str12, '\0', totLen); 

    for (int i = 0; i < len1; i++) 
    *(str12 + i) = *(str1 + i); 
    for (int i = 0; i < len2; i++) 
    *(str12 + i + len1) = *(str2 + i); 

    return str12; 
} 

int main(int argc, char *argv[]){ 
    char * S1= "ABCDE"; 
    char * S2= "FGH"; 

    char *S12 = NULL; 
    S12 = StrCat(S1, S2); 
    cout << "S12= "<< S12 << endl; // ABCDEFGH 
}