Неожиданные символы в выводе консоли

Я программирую новую сеть сервер-клиент для игры Crysis Wars.
У меня есть функция, которая центрирует строку по количеству символов, поддерживаемых на строку в окне консоли.
Окно вмещает 113 символов, но я установил максимальную ширину символов в моей функции 111 как хорошо вписаться в текст.

Это моя функция:

string Main::CenterText(string s)
{
return string((111 - s.length()) / 2, ' ') + s;
}

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

Я пытаюсь использовать эту функцию в этом контексте ( CryLogAlways функция просто записывает строку в лог-файл игры / сервера и печатает ее):

CryLogAlways(CenterText("   ____     ____      _ __      _  _  __").c_str());
CryLogAlways(CenterText("  /  _/__  / _(_)__  (_) /___ _( )| |/_/").c_str());
CryLogAlways(CenterText(" _/ // _ \\/ _/ / _ \\/ / __/ // //_>  <  ").c_str());
CryLogAlways(CenterText("/___/_//_/_//_/_//_/_/\\__/\\_, / /_/|_|  ").c_str());
CryLogAlways(CenterText("                         /___/          ").c_str());

Однако вывод:

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

Точно так же, как @ deW1 просил, у меня есть аналогичный вывод с CryLogAlways(CenterText("X").c_str());:

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

Почему я получаю этот вывод, и как я могу это исправить?

4

Решение

Вы используете тип string неквалифицированный. Я предполагал, что у вас есть using namespace std где-то (против лучшей практики), что сделало бы string Ссылаться на std::string, Но, видимо, это не так, и у вас есть неквалифицированное имя string определены для что-то (вопрос не показывает, что), который ведет себя аналогично std::string (то есть .length() а также .c_str()). Тем не менее, аргументы конструктора этого что-то кажется, в обратном порядке к тем из std::string,

Если вы хотите, чтобы ваша функция работала со стандартными строками библиотеки, скажите явно:

std::string Main::CenterText(std::string s)
{
return std::string((111 - s.length()) / 2, ' ') + s;
}

Это яркий пример того, почему крайне полезно использовать явную квалификацию для std типы.

8

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

В соответствии с C ++ Reference, вы правы.

Как указано в комментариях, для используемой строковой реализации аргументы переключаются.

Во втором примере вы печатаете знак (111-1) / 2 = 55 = ‘7’ для » = 32 раза.
Поменяйте местами аргументы

string(' ',(111 - s.length()) / 2)

и это должно работать лучше.

2