如何忽略字符串居中功能中的某些字符串?

时间:2016-07-03 16:10:47

标签: c++ iteration string-iteration

注意:直接连接到problem I had a few years ago,但我想解决那里的第一个问题,这不是问题的其他部分,所以请不要将其标记为副本我之前的问题。

我有一个string centring function根据给定的宽度(即113个字符)使给定字符串居中:

std::string center(std::string input, int width = 113) { 
    return std::string((width - input.length()) / 2, ' ') + input;
}

我正在使用游戏SDK来创建游戏服务器修改,此游戏SDK支持游戏命令控制台中的彩色字符串,使用美元符号和0-9的数字表示(即{{1并且不会在控制台本身打印。

上面的字符串居中功能将这些标记视为总字符串的一部分,因此我想添加这些标记占据宽度的字符总数,以便字符串实际居中。

我尝试修改功能:

$1

上述函数的目标是迭代字符串,添加当前字符和std::string centre(std::string input, int width = 113) { std::ostringstream pStream; for(std::string::size_type i = 0; i < input.size(); ++i) { if (i+1 > input.length()) break; pStream << input[i] << input[i+1]; CryLogAlways(pStream.str().c_str()); if (pStream.str() == "$1" || pStream.str() == "$2" || pStream.str() == "$3" || pStream.str() == "$4" || pStream.str() == "$5" || pStream.str() == "$6" || pStream.str() == "$7" || pStream.str() == "$8" || pStream.str() == "$9" || pStream.str() == "$0") width = width+2; pStream.clear(); } return std::string((width - input.length()) / 2, ' ') + input; } 的下一个字符,并评估ostringstream

这并不像我想的那样:

ostringstream

(来自服务器日志的摘录)

以下是该问题的简要摘要:

enter image description here

我想我可能会错过迭代的工作原理;我错过了什么,如何让这个功能以我想要的方式工作?

1 个答案:

答案 0 :(得分:1)

因此,您真正想要做的是计算字符串中$N的实例,其中N是十进制数字。要执行此操作,只需使用$查看std::string::find实例的字符串,然后检查下一个字符以查看它是否为数字。

std::string::size_type pos = 0;
while ((pos = input.find('$', pos)) != std::string::npos) {
    if (pos + 1 == input.size()) {
        break;  //  The last character of the string is a '$'
    }
    if (std::isdigit(input[pos + 1])) {
        width += 2;
    }
    ++pos;  //  Start next search from the next char
}

要使用std::isdigit,您需要先:

#include <cctype>