Заполнение stl строк в C ++ - PullRequest
45 голосов
/ 20 марта 2009

Я использую std::string и мне нужно оставить их на заданной ширине. Каков рекомендуемый способ сделать это в C ++?

Пример ввода:

123

Пэд до 10 символов.

Пример вывода:

       123

(7 пробелов перед 123)

Ответы [ 10 ]

58 голосов
/ 20 марта 2009

манипулятор std :: setw (setwidth)

std::cout << std::setw (10) << 77 << std::endl;

или

std::cout << std::setw (10) << "hi!" << std::endl;

выводит дополненный 77 и "привет!".

если вам нужен результат в качестве строки, используйте экземпляр std :: stringstream вместо объекта std :: cout.

ps: ответственный заголовочный файл <iomanip>

39 голосов
/ 20 марта 2009
void padTo(std::string &str, const size_t num, const char paddingChar = ' ')
{
    if(num > str.size())
        str.insert(0, num - str.size(), paddingChar);
}

int main(int argc, char **argv)
{
    std::string str = "abcd";
    padTo(str, 10);
    return 0;
}
22 голосов
/ 20 марта 2009

Вы можете использовать это так:

std::string s = "123";
s.insert(s.begin(), paddedLength - s.size(), ' ');
21 голосов
/ 20 марта 2009

Самый простой способ, которым я могу придумать, был бы с помощью струнного потока:

string foo = "foo";
stringstream ss;
ss << setw(10) << foo;
foo = ss.str();

foo теперь должно быть дополнено.

7 голосов
/ 20 марта 2009

вы можете создать строку, содержащую N пробелов, вызвав

string(N, ' ');

Так что вы можете сделать так:

string to_be_padded = ...;
if (to_be_padded.size() < 10) {
  string padded(10 - to_be_padded.size(), ' ');
  padded += to_be_padded;
  return padded;
} else { return to_be_padded; }
5 голосов
/ 17 февраля 2016
std::string pad_right(std::string const& str, size_t s)
{
    if ( str.size() < s )
        return str + std::string(s-str.size(), ' ');
    else
        return str;
}

std::string pad_left(std::string const& str, size_t s)
{
    if ( str.size() < s )
        return std::string(s-str.size(), ' ') + str;
    else
        return str;
}
2 голосов
/ 20 марта 2009

Есть хороший и простой способ :)

const int required_pad = 10;

std::string myString = "123";
size_t length = myString.length();

if (length < required_pad)
  myString.insert(0, required_pad - length, ' ');
1 голос
/ 20 марта 2009

Как насчет:

string s = "          "; // 10 spaces
string n = "123";
n.length() <= 10 ? s.replace(10 - n.length(), n.length(), s) : s = n;
0 голосов
/ 19 января 2019

Я искал тему, потому что я разрабатываю VCL; В любом случае, сделать функцию было не так сложно.

void addWhiteSpcs(string &str, int maxLength) {
    int i, length;

    length = str.length();
    for(i=length; i<maxLength; i++)
    str += " ";
};

string name1 = "johnny";
string name2 = "cash";

addWhiteSpcs(name1, 10);
addWhiteSpcs(name2, 10);

В обоих случаях это добавит справа 10 пробелов. Я рекомендую использовать моноширинные шрифты, такие как курьер или консоль, для правильного формата.

Это то, что происходит, когда вы не используете моноширинный шрифт
Джонни ____
наличный ______

// using monospace font the output will be
johnny____
cash______

Оба случая имеют одинаковую длину.

0 голосов
/ 20 марта 2009

Создайте новую строку из 10 пробелов и вернитесь в обе строки.

string padstring(const string &source, size_t totalLength, char padChar)
{
    if (source.length() >= totalLength) 
        return source;

    string padded(totalLength, padChar);
    string::const_reverse_iterator iSource = source.rbegin();
    string::reverse_iterator iPadded = padded.rbegin();
    for (;iSource != source.rend(); ++iSource, ++iPadded)
        *iPadded = *iSource;
    return padded;
}
...