Манипулирование строками Многогранные буквы как в python - PullRequest
1 голос
/ 20 февраля 2020

В pyhton вы можете делать такие вещи, как

word = "e" * 5
print(word)

Чтобы получить "eeeee"

Но когда я пытаюсь сделать то же самое в C ++, у меня возникают проблемы, когда вывод не содержит любой текст представляет собой код, который я пытаюсь

playerInfo.name + ('_' * (20 - sizeof(playerInfo.name)))

Я пытаюсь связать длину строки, чтобы все в списке игроков было встроено друг в друга

Заранее благодарен за любую помощь

Ответы [ 3 ]

4 голосов
/ 20 февраля 2020

Если ваша настоящая проблема заключается в том, что вы хотите отображать имена с определенной шириной, не изменяйте базовые данные. Вместо этого используйте возможности форматирования ostream для настройки выравнивания и ширины заливки. Базовые данные следует , а не , чтобы их можно было отображать. Функция отображения должна иметь возможность принимать базовые данные и форматировать их по мере необходимости.

Это взято из https://en.cppreference.com/w/cpp/io/manip/left, которое конкретно описывает функцию std::left, но показывает примеры std::setw и std::fill, что должно дать вам то, что вы хотите. Вам нужно будет #include <iomanip>, чтобы использовать эти функции.

#include <iostream>
#include <iomanip>

int main(int argc, char** argv)
{
    const char name1[] = "Yogesh";
    const char name2[] = "John";

    std::cout << "|" << std::setfill(' ') << std::setw(10) << std::left << name1 << "|\n";
    std::cout << "|" << std::setfill('*') << std::setw(10) << std::right << name2 << "|\n";
}

Выходы

|Yogesh    |
|******John|

Замечание о постоянстве std :: cout и ostreams

Обратите внимание, что std::cout является объектом std::ostream и по умолчанию действует в течение всего времени жизни вашей программы (или для достаточного количества вашей программы, что оно достаточно близко к времени жизни). Как объект, он имеет переменные-члены. Когда мы вызываем std::setfill('*'), мы устанавливаем одну из этих переменных-членов (символ заполнения) и перезаписываем символ заполнения по умолчанию. Когда мы вызываем std::setw(10), мы устанавливаем базовую ширину потока, пока другая функция не очистит его.

std::setfill, std::left, std::right будут сохраняться до тех пор, пока вы явно не установите их в другое значение ( они не возвращаются к значениям по умолчанию автоматически). std::setw будет сохраняться до тех пор, пока один из (от https://en.cppreference.com/w/cpp/io/manip/setw)

operator<<(basic_ostream&, char) and operator<<(basic_ostream&, char*)
operator<<(basic_ostream&, basic_string&)
std::put_money (inside money_put::put())
std::quoted (when used with an output stream)

Таким образом, std::setw будет сохраняться до следующего std::string или const char * вывода.

1 голос
/ 20 февраля 2020

В случае повторения одного символа, вы можете использовать std::string(size_type count, CharT ch), например:

std::string str(5, 'e');
std::cout << str << std::endl; // eeeee
0 голосов
/ 20 февраля 2020

Нет перегруженного оператора * для std :: string. Вы должны написать пользовательскую функцию

std::string multiply_str(std::string in, size_t count)
{
    std::string ret;
    rest.reserve(in.size() * count);
    for(int i = 0; i < count; i++)
         rest += in;
    return ret;
}

Или, если она только на символе:

std::string(your char here, how much)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...