Выровнять текст по центру в строке C++
Я пытался создать в C++ функцию для DLL игрового сервера, которая выравнивает заданный текст по центру, а затем возвращает новую строку в Lua для обработки. Я потратил довольно много времени на просмотр примеров на разных сайтах, но смог найти только "cout", который печатает его в консольном приложении, чего я не хочу.
Я новичок в C++, и я действительно не понимаю, как к этому подойти. Если кто-то сможет привести пример и объяснить, как он работает, я смогу узнать, как это сделать в будущем.
В основном это делает это:
- Перешлите нашу строку из Lua в C++.
- C++ центрирует строку, которую мы только что передали.
- Верните завершенную строку обратно Lua.
Вот пример того, что я пытался сделать:
int CScriptBind_GameRules::CentreTextForConsole(IFunctionHandler *pH, const char *input)
{
if (input)
{
int l=strlen(input);
int pos=(int)((113-l)/2);
for(int i=0;i<pos;i++)
std::cout<<" ";
std::cout<<input;
return pH->EndFunction(input);
}
else
{
CryLog("[System] Error in CScriptBind_GameRules::CentreTextForConsole: Failed to align");
return pH->EndFunction();
}
return pH->EndFunction();
}
Который строит, но выводит текст на консоль, не пересылая обратно завершенную строку.
2 ответа
Я предполагаю, что вы уже знаете, как передать строку из Lua в C++ и вернуть результат из C++ в Lua, поэтому единственная часть, с которой нам нужно иметь дело, - это создание центрированной строки.
Это, однако, довольно легко:
std::string center(std::string input, int width = 113) {
return std::string((width - input.length()) / 2, ' ') + input;
}
Вот еще один способ, который обеспечит центрирование текста в пределах заданной ширины и заполнение пробелами влево и вправо.
std::string center(const std::string s, const int w) {
std::stringstream ss, spaces;
int pad = w - s.size(); // count excess room to pad
for(int i=0; i<pad/2; ++i)
spaces << " ";
ss << spaces.str() << s << spaces.str(); // format with padding
if(pad>0 && pad%2!=0) // if pad odd #, add 1 more space
ss << " ";
return ss.str();
}
Это можно было бы написать более элегантно или кратко.
std::string center (const std::string& s, unsigned width)
{
assert (width > 0);
if (int padding = width - s.size (), pad = padding >> 1; pad > 0)
return std::string (padding, ' ').insert (pad, s);
return s;
}