c++ - 使用某些代码时出现格式错误

标签 c++ lua

我正在使用一些代码将一些给定文本居中,然后将新字符串解析回 Lua,以便它可以将新消息发送到目的地(玩家的游戏控制台,或玩家)。 当我使用这段代码时,我总是在控制台右侧出现奇怪字符的格式错误。有人告诉我这是一个字符串内存错误,但告诉我这件事的人不知道如何解决这个问题。

在我们将新消息放入其中之前,该字符串已被清除。我试过使用和不使用控制台颜色符号($ 后跟一个 0-9 的整数),同样的问题仍然存在。 使用正常的非中央控制台消息,我没有遇到这个问题。有关示例,请参见图片。 The problem: Look at the weird 'Xc' symbols

代码:

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

最佳答案

我的印象是你没有正确地结束你的字符串,所以你耗尽了你的控制台宽度,它显示了一些“太长”的指示字符。

试试

 newmsg[linelength] = 0;

在 msglen 初始化行之前,如果要填充完整的 113 个字符行,否则在 处添加零

 startpos + msglen 

删除将消息区域中的所有内容归零的有趣循环,因为无论如何都会用空格字符重写它。 而是使用

 startpos=(linelength-msglen)/2

尽量减少截断错误。

关于c++ - 使用某些代码时出现格式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17638981/

上一篇:c++ - 遍历 vector

下一篇:C++ 包含结构

相关文章:

c++ - T D[N] 是否总是声明数组类型的对象?

android - 所有 Corona SDK 项目在舞台上都以某种方式偏离中心,即使是示例代码也是如此

c++ - 为什么显式特化和部分特化在语法上存在差异?

lua - 找不到模块 'cudnn' :No LuaRocks module found for cudnn

c - C 中的嵌套 Lua 元表

string - 是否可以更改 Lua 字节码中的字符串(内容和大小)以使其仍然正确?

nginx - 使用 NGINX 和 Lua 限制每个 IP 的请求频率

c++ - 我需要默认隐藏 QTableWidget

c++ - 使用 g++ 预处理器检测 size_t 是否内置

c++ - 这是 "elision failure"语言强制要求的吗?