使用某些代码时出现格式错误。

我正在使用一些代码将给定的文本居中,然后将新字符串解析回 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
点赞
用户2579220
用户2579220

我觉得你没有正确地结束你的字符串,因此超出了控制台的宽度,这显示了一些“太长”的指示字符。

如果你想填满完整的 113 个字符行,请在带有 msglen 初始化的行之前尝试

newmsg[linelength] = 0;

否则,请在

startpos + msglen

处添加零。

删除有趣的“循环”,该“循环”将消息区中的所有内容都重新编写为空格。相反,使用

startpos=(linelength-msglen)/2

来最小化截断误差。

2013-07-14 11:39:30