2015-09-19 33 views
-3

我正在做一個聊天的事情,當有人輸入「%s」或「%s%s%s」時,每個人的客戶端崩潰,繼承人有點像我這樣做。使用%s崩潰讀取%s

const char* pszID = their id 
const char* pszName = their name 
const char* pszChatText = their raw message 

if (!pszID || !pszName || !pszChatText) 
return; 

std::string strChat; 
strChat.append("["); 
strChat += pszID; 
strChat.append(" :: "); 
strChat += pszName; 
strChat.append("] "); 
strChat += pszChatText; 

SendToServer(strChat.c_str()); 

這樣,如果他們進入%s%S%S 的pszChatText爲%s%s%S和崩潰。

,但我想它做它一般都喜歡,

[A48AJV :: thegamerman3000032] %s%s%s 

和sendtoserver是一個崩潰,它只是一個一個const char *的printf()的,我也檢查,如果它是一個空指針

編輯:固定爲指導

+5

如果客戶端,當它接收到該消息崩潰,錯誤是在客戶端接收消息。您粘貼的代碼與處理接收消息的客戶端無關。 –

回答

1

這聽起來像你直接將字符串作爲第一個參數傳遞到printf。不要這樣做。這是因爲第一個參數被解析爲佔位符。如果指定的佔位符多於可變參數,則程序將崩潰。

改爲提供"%s"作爲第一個參數,將字符串作爲第二個參數。

例如:

string chatMessage = "makeItCrash%s%s%s"; 
printf("%s", chatMessage); // program will not crash now 
+0

嘗試使用'「%s」,strPushToConsole.c_str()'而沒有'c_str()',但仍然崩潰時有人做%s作爲他們的消息,它可以是我=? –