2016-07-21 82 views
1

我正在製作一個遊戲,程序自動廣播用戶在線。廣播消息將由以下組成:
1.字節:0到6的值
2-5。字節:一個RGBA顏色
6 -...字節:用戶的名字
C++連接字符數組

的前5個字節被存儲在char buf_begin,而用戶名存儲在std::string username

我嘗試這樣做:

std::string buf_begin_s(buf_begin); 
std::string buf = buf_begin_s + username; 

sendto(udp_br, buf.c_str(), sizeof(buf.c_str()), 0, (sockaddr *)&to, sizeof(to)); 

的問題是,buf字符串不包含1-5。字節,只有用戶名。

+1

不,不是'sizeof(指針)'。試試'strlen'或'buf.length()'。 – LogicStuff

+1

由於'buf'可能包含''\ 0'','strlen()'在這裏不起作用。 –

回答

1
std::string buf_begin_s(buf_begin); 

如果像你說的,buf_begin是一個5個字符的緩衝區,第一個字符可以是0,那麼當它是0 buf_begin_s最終成爲一個空字符串。這個構造函數需要一個以'\0'字符結尾的C風格的字符串。如果buf中的第一個字符是0字節,這將成爲故事的結尾。

如果緩衝區中的5個字符都不是0,則會導致未定義的行爲,因爲構造方法會在內存中前進,查找'\0'字節。

這也許應該是:

std::string buf_begin_s(buf_begin, buf_begin+5); 

sendto()調用也是錯誤的:

sendto(udp_br, buf.c_str(), sizeof(buf.c_str()), 0, (sockaddr *)&to, sizeof(to)); 

由於buf.c_str()const char *,第三個參數會sizeof(const char *),或4或8,取決於關於這是32位還是64位平臺。不管buf有多少,sizeof(buf.c_str())總是4或8.這顯然是錯誤的。

這應該只是buf.size()