统计一组字符出现的次数,并从字符串中减去空格。

请参见下面的第一幅图以获取问题。您可以看到,文本的第一行正确对齐,但第二行没有。

几个月前,我编写了一些代码,以使字符串中的文本居中,以便将其精美地处理到用于游戏服务器修改的控制台上。这个代码非常好用,但有两个主要问题:

  • 如果超过实际控制台的112字符限制,则游戏服务器会崩溃(在正常控制台消息中不会出现此问题)

  • 在文本中使用颜色会导致字符串向右移动两个字符的每个颜色代码

我正在试图解决第二个问题(尽管解决第一个问题将是巨大的好处),但不知道如何做到这一点。我不能简单地取出颜色编码,因为需要对文本进行着色。

如果没有9种颜色可供选择,则此代码可能很简单:

*$1= 白色
*$2= 暗蓝色
*$3= 绿色
*$4= 红色
*$5= 黄色
*$6= 浅蓝色
*$7= 紫色
*$8= 橙色
*$9= 灰色

我也不想简单地搜索'$',因为在某些情况下,它被用作普通字符。

在插入空格时忽略$1-$9是否可能?如果是,我该怎么处理?

代码

int CScriptBind_GameRules::CentreTextForConsole(IFunctionHandler *pH, const char *msg)
{
    if (msg)
    {
        const int linelength=200;
        char newmsg[linelength+1];
        for(int i=0;i<linelength;i++)
            newmsg[i]=0;
        for(int i=0;i<linelength;i++)
            newmsg[i]=' ';
        newmsg[linelength]=0;
        int msglen=strlen(msg);
        int startpos=4+linelength/2-msglen/2;
        for(int i=msglen-1;i>=0;i--)
            newmsg[startpos+i]=msg[i];
        msg=0; //Null the message.
        return pH->EndFunction(newmsg);
}
else
{
    return pH->EndFunction();
}

示例

我现在无法访问我的开发PC,因为我在上班-如果此问题未得到解决,我将在几个小时后返回时发布屏幕截图。

从Lua调用:

Core.CenteredConsole:All(g_gameRules.game:CentreTextForConsole("$1Crysis$4Wars Infinity iX 5.0"));

这显示了它应该的样子。消息只有在长度小于80个字符时才能正常工作。

enter image description here

点赞
用户2703169
用户2703169

你的程序崩溃是因为数组的定义长度。适当地调整'newmsg'的大小。

还要检查startpos+i>=0&&<数组长度。。。


关于你的第二个问题:

正如你所说:

在文本中使用颜色会导致每个颜色代码向右移动两个字符

看起来颜色代码会在打印之前被删除,你的问题出在你考虑到了包含颜色代码的消息长度...

如果是这样,我该如何解决?

例如,在'msg'中每找到一个颜色代码就少添加2个空格。

2013-11-20 13:50:36