Подсчитать вхождение набора символов и вычесть пробелы из строки

Смотрите первое изображение ниже для решения проблемы. Вы можете видеть, что первая строка текста правильно выравнивается, а вторая — нет.

Несколько месяцев назад я написал некоторый код, который центрирует текст в строке, чтобы аккуратно обработать его на консоли для модификации игрового сервера. Этот код работает очень хорошо, но имеет две основные проблемы:

  • Игровой сервер вылетает, если мы превышаем ограничение на 112 символов реальной консоли (эта проблема не возникает в обычном сообщении консоли)

  • Использование цветов в тексте приводит к сдвигу строки вправо на два символа для каждого цветового кода

Я ищу решение второй проблемы (хотя решение первой будет огромным преимуществом), но не знаю, как это сделать. Я не могу просто убрать цветовую кодировку, так как это необходимо для раскрашивания текста.

Этот код может быть простым, если у меня не было 9 типов цвета на выбор:

*$1= White
*$2= Dark Blue
*$3= Green
*$4= Red
*$5= Yellow
*$6= Light Blue
*$7= Purple
*$8= Orange
*$9= Grey

Я не хочу просто искать ‘$’, поскольку в некоторых случаях он используется как обычный символ.

Возможно ли игнорирование $ 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();
}

пример

Я не могу добраться до своего ПК для разработки прямо сейчас, так как работаю — я выложу скриншот через несколько часов, когда вернусь, если эта проблема не будет решена.

Звонящий из Lua:

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

по убыванию

Это показывает, как это должно выглядеть. Сообщение работает только в том случае, если оно имеет длину менее 80 символов.

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

2

Решение

Ваша программа вылетает из-за определенной длины ваших массивов. Изменение размера newmsg надлежащим образом

Также проверьте, что startpos + i >= 0 && < length of array


Что касается вашего второго вопроса:

Как вы сказали:

Использование цветов в тексте приводит к сдвигу строки вправо на два символа для каждого цветового кода

Кажется, что цветовые коды удаляются перед печатью, и ваши проблемы возникают, потому что вы учитываете длину сообщения, которое включает в себя цветовые коды …

Если так, как бы я подошел к этому?

Возможно добавление на 2 меньше места для каждого цветового кода, найденного на msg например.

1

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

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

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