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

Я программирую новую сеть сервер-клиент для игры 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());:

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

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

2 ответа

Решение

Вы используете тип 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 типы.

Согласно C++ Reference, вы правы.

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

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

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

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

Другие вопросы по тегам