Н.Б .: Прямое подключение к проблема у меня была несколько лет назад, но я бы хотел решить первую проблему, которая не была частью вопроса, поэтому не помечайте ее как дубликат моего предыдущего вопроса.
у меня есть функция центрирования строки центрирует данную строку в соответствии с заданной шириной (которая составляет 113 символов):
std::string center(std::string input, int width = 113) {
return std::string((width - input.length()) / 2, ' ') + input;
}
Я использую игровой SDK для создания модификации игрового сервера, и этот игровой SDK поддерживает цветные строки в командной консоли игры, которые обозначаются знаком доллара и числом от 0 до 9 (т.е. $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
,
Это не совсем так, как я хотел:
<16:58:57> 8I
<16:58:57> 8IIn
<16:58:57> 8IInnc
<16:58:57> 8IInncco
<16:58:57> 8IInnccoom
<16:58:57> 8IInnccoommi
<16:58:57> 8IInnccoommiin
<16:58:57> 8IInnccoommiinng
<16:58:57> 8IInnccoommiinngg
<16:58:57> 8IInnccoommiinngg C
<16:58:57> 8IInnccoommiinngg CCo
<16:58:57> 8IInnccoommiinngg CCoon
<16:58:57> 8IInnccoommiinngg CCoonnn
<16:58:57> 8IInnccoommiinngg CCoonnnne
(фрагмент из журнала сервера)
Вот краткое изложение проблемы:
Я думаю, что мне может не хватать, как работает итерация; что мне не хватает, и как я могу заставить эту функцию работать так, как я хочу?
Итак, что вы действительно пытаетесь сделать, это подсчитать случаи $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>
Других решений пока нет …