2012-06-25 51 views
0

我用下面的switch語句得到了一些非常奇怪的行爲使用INT:C++非常怪異的行爲,而在開關

string recognise_mti(int mti_code) 
{ 
switch(mti_code) 
    { 
    case 1100: 
    case 1101: 
     return (mti_code + " (Auth. Request/Repeat)"); break; 

    default: 
     return (mti_code + " (NOT RECOGNISED)"); break; 
    } 
} 

它似乎返回各種根據輸入整數事情。這可能會是一個愚蠢的錯誤,但到目前爲止,我無法識別它。感謝任何幫助。

+2

您可能希望更詳細地說明有關接收到的結果。 – LiMar

+1

與你的問題沒有關係,但是在'case'中做'return'作爲唯一的事情時,你不需要'bre​​ak'。原因是'return'返回,'break'不會被執行。當然,一個現代編譯器可能會注意到這一點,而不是爲'break'生成代碼。 –

+0

@JoachimPileborg啊,我沒有意識到這一點,謝謝! – user1474955

回答

10

mti_code" (Auth. Request/Repeat)"都不是std::string。所以實際上,所有的補充都是指針加法。所以你最終會得到一個隨機的(可能是無效的)指針,然後將其隱式轉換爲std::string

試試這個:

#include <sstream> 

... 

std::stringstream ss; 
ss << mti_code; 
switch(mti_code) 
    { 
    case 1100: 
    case 1101: 
     ss << " (Auth. Request/Repeat)"; break; 

    default: 
     ss << " (NOT RECOGNISED)"; break; 
    } 
return ss.str(); 
+0

啊感謝您的解釋和幫助,是有道理的,現在,一個愚蠢的(和尷尬)的錯誤的位,我不得不說。 :) – user1474955

4

您正在添加一個整數和字符串文字。這在C++代碼中並不典型。

可能發生的情況是您要返回一個由無效字符指針構成的字符串,因爲文字長度小於1100個字符。

0

不能連接整數,字符串字面量+。您需要首先將整數轉換爲字符串。你可以用stringstreamsprintf()來做到這一點。

0

您正在將int添加到const char*並將其作爲string返回。

2

您正在嘗試將一個整數添加到C風格的字符串中,該字符串不符合您的期望。該字符串被轉換爲指向其第一個字符的指針,然後該指針遞增1100(或其他)字節,從字符串末尾增加到隨機存儲器中。如果你幸運的話,該程序將崩潰;如果你不走運,那麼該函數將返回垃圾。

你可以使用一個字符串流來構建字符串:

std::ostringstream result; 
switch(mti_code) 
{ 
case 1100: 
case 1101: 
    result << mti_code << " (Auth. Request/Repeat)"; break; 

default: 
    result << mti_code << " (NOT RECOGNISED)"; break; 
} 
return result.str(); 

或C++ 11,你可以使用std::to_string到整數轉換:

return std::to_string(mti_code) + " (Auth. Request/Repeat)"; 
+0

哪個編譯器支持C++ 11? – user1474955

2

您試圖追加一個字符串到一個整數。這在C或C++中是不可能的。你必須爲整數轉換爲字符串不知何故,std::ostringstream是推薦的方式:

std::string recognise_mti(const int mti_code) 
{ 
    std::ostringstream ostr; 

    switch(mti_code) 
    { 
    case 1100: 
    case 1101: 
     ostr << mti_code << " (Auth. Request/Repeat)"; 
     break; 

    default: 
     ostr << mti_code << " (NOT RECOGNISED)"; 
     break; 
    } 

    return ostr.str(); 
} 

或者,如果你有一個編譯器支持C++ 11和std::to_string您可以使用:

std::string recognise_mti(const int mti_code) 
{ 
    switch(mti_code) 
    { 
    case 1100: 
    case 1101: 
     return std::to_string(mti_code) + " (Auth. Request/Repeat)"; 

    default: 
     return std::to_string(mti_code) + " (NOT RECOGNISED)"; 
    } 
} 
1

你看到你正在給一個給定的字符串文字的第一個字節的地址添加一個整數值?這基本上是未定義的行爲,因爲您正在將「1100」偏移到「正確」(因爲我們正在討論chars,這是位於內存街道下方1100個字節的地址)。例如,在我的示例中,如果我嘗試將給定的字符串文字的地址偏移1100,則會「初始化」。這是因爲偏移地址被返回並隱含地轉換爲字符串,該字符串被讀取爲位於給定地址處的任何地址。

可以是任何東西,我的例子字符串,「瘋狂大象」或祕密的方式,使全C++在MSVC 11的支持。 :P

如果我要嘗試多了一個字符(一個字節,一個向右偏移),以抵消它:

recognise_mti(1100); // "being initialized." 
recognise_mti(1101); // "eing initialized."