我正在使用一些代码来处理某些给定文本,然后将新字符串解析回Lua,以便它可以将新消息发送到目标(玩家或玩家的游戏控制台)。 当我使用这段代码时,我总是会在控制台右侧出现奇怪字符的格式错误。我被告知这是一个字符串内存错误,但告诉我这个人不知道如何解决这个问题。
在我们将新消息放入其中之前,字符串已被清除。我已尝试使用和不使用控制台颜色符号($后跟0-9的整数),同样的问题仍然存在。 使用正常的非中心控制台消息,我不会遇到此问题。有关示例,请参见图像。
代码:
int CScriptBind_GameRules::CentreTextForConsole(IFunctionHandler *pH, const char *msg)
{
if (msg)
{
const int linelength=113;
char newmsg[linelength+1];
for(int i=0;i<linelength;i++)
newmsg[i]=0;
for(int i=0;i<linelength;i++)
newmsg[i]=' ';
int msglen=strlen(msg);
int startpos=linelength/2-msglen/2;
for(int i=msglen-1;i>=0;i--)
newmsg[startpos+i]=msg[i];
return pH->EndFunction(newmsg);
}
else
{
CryLog("[System] Error in CScriptBind_GameRules::CentreTextForConsole: Failed to align");
return pH->EndFunction();
}
return pH->EndFunction();
}
发送:
CMCCPlayer(player, "================================================================================================================");
CMCCPlayer(player, "$4#### ### ### ###### ####");
CMCCPlayer(player, "$4## ### ### ## ## ##");
CMCCPlayer(player, "$4## ### ### ## ##");
CMCCPlayer(player, "$4## ### ##### ###### ### ##");
CMCCPlayer(player, "$4## ### ### ## ##");
CMCCPlayer(player, "$4## ### ### ## ## ## ");
CMCCPlayer(player, "$4#### ### ### ###### ####");
CMCCPlayer(player, "================================================================================================================");
CMCCPlayer(player, "$4");
CMCCPlayer(player, "$4Your Name: "..player:GetName());
CMCCPlayer(player, "$4Your Country: "..Omega.GetCountry(player));
CMCCPlayer(player, "$4Your Domain:"..player.actor:GetHostname());
CMCCPlayer(player, "$4Your Profile ID: "..ProfId(player));
if not player.exp then player.exp = 0 end
CMCCPlayer(player, "$4Your EXP: "..player.exp);
CMCCPlayer(player, "$4");
CMCCPlayer(player, "$4o0o");
功能:
function CMCCPlayer(player, msg)
g_gameRules.game:SendConsoleMessage(player.id, g_gameRules.game:CentreTextForConsole(msg));
end
答案 0 :(得分:2)
我的印象是你没有正确地结束你的字符串,所以你耗尽了你的控制台宽度,这显示了一些“太长”的字符。
尝试
newmsg[linelength] = 0;
在msglen初始化之前的行,如果要填充完整的113个字符行,否则在
处添加零 startpos + msglen
删除有趣的循环,将消息区域中的所有内容都归零,因为无论如何都要用空格字符重写。 请使用
startpos=(linelength-msglen)/2
最小化截断错误。