سؤال

وأنا باستخدام std::string وتحتاج إلى لوحة تركهم لعرض معين. ما هي الطريقة الموصى بها للقيام بذلك في C ++؟

وإدخال عينة:

123

وسادة إلى 10 حرفا.

وإخراج نموذج:

       123

(7 المساحات أمام 123)

هل كانت مفيدة؟

المحلول

والأمراض المنقولة جنسيا :: setw (setwidth) مناور

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

أو

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

ومبطن مخرجات 77 و"مرحبا!".

وإذا كنت بحاجة إلى النتيجة كما المثال استخدام سلسلة من الأمراض المنقولة جنسيا :: stringstream بدلا الأمراض المنقولة جنسيا :: cout الكائن.

ملاحظة: رأس مسؤول ملف <iomanip>

نصائح أخرى

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;
}

ويمكنك استخدامه مثل هذا:

std::string s = "123";
s.insert(s.begin(), paddedLength - s.size(), ' ');

وقال إن أسهل طريقة يمكنني أن أفكر في أن يكون مع stringstream:

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

وينبغي الآن مبطن foo.

ويمكنك إنشاء سلسلة تحتوي على مساحات 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; }
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;
}

وهناك طريقة لطيفة وبسيطة :)

const int required_pad = 10;

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

if (length < required_pad)
  myString.insert(0, required_pad - length, ' ');

وماذا عن:

string s = "          "; // 10 spaces
string n = "123";
n.length() <= 10 ? s.replace(10 - n.length(), n.length(), s) : s = n;

وكنت أبحث في الموضوع لايم تطوير 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 المساحات الفارغة. أنا نوصي لاستخدام خطوط أحادي المسافة مثل البريد أو consolas لبالشكل الصحيح.

وهذا هو ما يحدث عندما كنت لا تستخدم أحادي المسافة الخط
johnny____
النقد ______

// using monospace font the output will be
johnny____
cash______

وكلتا الحالتين لها نفس الطول.

وإنشاء سلسلة جديدة من 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top