如何正确复制此 Lua 函数的功能?

我有如下 Lua 函数:

Len = function(msg, length, dir)
    if not msg or not length then
        return "Unknown";
    end
    local msgC = msg:gsub("$%d", "");
    if (dir == "l") then
        return string.rep(" ", length - #msgC)..msg;
    else
        return msg..string.rep(" ", length - #msgC);
    end
end

它会将字符串填充到指定的方向,结果是一个字符串,要么右对齐,要么左对齐到指定数量的字符(主要用于格式化列表)。我尝试在 C++ 中复制上述功能:

std::string Len(string msg, int charCount, string dir)
{
    int spacesRequired = (charCount-msg.length()/2);
    std::ostringstream pStream;
    if (dir == "l")
        pStream << std::string(spacesRequired, ' ') << msg;
    else
        pStream << msg << std::string(spacesRequired, ' ');
    return pStream.str();
}

...然而它不能正常工作:

图片描述

我还使用了一个函数将整个字符串居中,但这与问题无关,因为问题在于 Len C++ 函数。

我在这里做错了什么,我该如何纠正?我认为问题在于我对 local msgC = msg:gsub("$%d", ""); 的理解不正确,它(据我理解,可能是不正确的)获取了字符串的长度。这导致了 int spacesRequired = (charCount-msg.length()/2);,它会做同样的事情,即 length - #msgC

点赞
用户2422013
用户2422013

我没有考虑到颜色代码。

游戏使用 $[0-9] 的颜色代码来为游戏提供彩色控制台消息的能力。似乎 msg:gsub("$%d", "") 的作用是搜索这些颜色代码并返回出现的数量;我的 C++ 函数没有这么做。

我所要做的就是修改函数,以搜索这些颜色代码并将它们添加到 charCount 中。为此,我使用了 How can I ignore certain strings in my string centring function? 中的一部分代码:

std::string Aurora64::Length(string msg, int charCount, string dir)
{
    int msgC = 0;
    std::string::size_type pos = 0;
    while ((pos = msg.find('$', pos)) != std::string::npos) {
        if (pos + 1 == msg.size()) {
            break;
        }
        if (std::isdigit(msg[pos + 1])) {
            msgC++;
        }
        ++pos;
    }
    charCount=charCount+msgC;

    int spacesRequired = charCount-(msg.length()-msgC);
    std::ostringstream pStream;
    if (dir == "l")
        pStream << std::string(spacesRequired, ' ') << msg;
    else
        pStream << msg << std::string(spacesRequired, ' ');
    return pStream.str();
}

...这将产生期望的输出:

enter image description here

第三个消息中的小错误是由消息本身中的额外空格导致的,所以不是问题。

2016-07-05 19:01:38