2012-07-26 125 views
0

所以我最近一直在C++,C#和Java之間來回切換,並編寫了一些C++代碼,我做了這樣的事情。C++連接糟糕

string LongString = "Long String"; 

char firstChar = LongString.at(0); 

,然後試圖用看起來像這樣的方法,

void MethodA(string str) 
{  
//some code  
cout << str;  
//some more code } 

這裏是我是如何實現它。

MethodA("1. "+ firstChar); 

儘管在C#和Java中完全有效,但在C++中做了一些奇怪的事情。

我預計像

// 1。 L

但它給了我稍後在程序中的其他字符串文字的一部分。

我究竟做了什麼?

我應該注意我已經修復了這個錯誤,以便打印出我期望的內容,但是我真的對我錯誤地做了什麼感興趣。

提前致謝。

+0

可能重複的[可以字符串文字和字符文字連接?](http://stackoverflow.com/questions/635807/can-a-string-literal-and-a-character-literal-be-串聯) – ecatmur 2012-07-26 18:01:50

+0

@cdhowie感謝您的編輯。我如何獲得語法高亮功能?我想下次自己做。 – Dan 2012-07-26 19:02:10

+0

@Dan您可以點擊編輯鏈接查看編輯後的文本。 – cdhowie 2012-07-26 19:03:03

回答

3

C++沒有定義的添加對字符串文字作爲串聯。相反,字符串文字衰減爲指向其第一個元素的指針;一個字符被解釋爲一個數值,所以結果是一個指針從程序的只讀存儲器段中的一個位置偏移到另一個位置。

爲了獲得另外作爲級聯,使用std::string

MethodA(std::string() + "1. " + firstChar); 
+0

請注意,這會將參數的類型從'const char *'更改爲'std :: string'(根據'MethodA'的聲明,這可能很好或不會)。另外,等價但稍好:'std :: string(「1。」)+ firstChar' – 2012-07-26 18:04:21

2
MethodA("1. "+ firstChar); //your code 

不做你想做的事。它是一個指針算術:它只是將一個整數值(即firstChar)添加到字符串文字"1. "的地址,然後將結果(它是char const*類型)傳遞給該函數,並在該函數中轉換爲string類型。根據firstChar的值,它可能會調用未定義的行爲。 事實上,就你而言,它會調用未定義的行爲,因爲生成的指針指向字符串字面之外。

寫:

MethodA(string("1. ")+ firstChar); //my code 
+0

@downvoter:請解釋downvote所以我可以糾正自己。 – Nawaz 2012-07-26 18:10:17

3
MethodA(std::string("1. ")+ firstChar); 

因爲 「1」 是爲const char [4]和不具有的concat方法)

2

的問題是,"1. "是一個字符串(字符數組),這將衰變成一個指針。字符本身是char,可以被提升爲int,並且const char*int的添加被定義爲通過將原始指針偏移多個位置來計算新指針。

你在C++代碼與添加(int)firstChar(字符的ASCII值),以字符串文字"1. ",其中如果firstChar的值大於4(它可能是)將是不確定的行爲的結果調用MethodA

1

C++中的字符串常量不是std::string的實例,而是常量數組char s。因此,通過向其添加一個char對字符指針的隱式轉換,然後將該字符的數值遞增,發生了指向存儲在.data段中的另一個字符串字面值的情況。