Как я могу игнорировать определенные строки в моей функции центрирования строк?

Н.Б .: Прямое подключение к проблема у меня была несколько лет назад, но я бы хотел решить первую проблему, которая не была частью вопроса, поэтому не помечайте ее как дубликат моего предыдущего вопроса.

у меня есть функция центрирования строки центрирует данную строку в соответствии с заданной шириной (которая составляет 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

(фрагмент из журнала сервера)

Вот краткое изложение проблемы:

введите описание изображения здесь

Я думаю, что мне может не хватать, как работает итерация; что мне не хватает, и как я могу заставить эту функцию работать так, как я хочу?

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>
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]