2009-03-20 15 views
38

Tôi đang sử dụng std::string và cần phải dán chúng lại thành một chiều rộng nhất định. Cách được khuyến nghị để làm điều này trong C++ là gì?Chuỗi đệm trong chuỗi C++

mẫu đầu vào:

123 

pad 10 ký tự.

Mẫu đầu ra:

 123 

(7 gian ở phía trước của 123)

Trả lời

50

std :: setw (setwidth) thao túng

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

hoặc

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

đầu ra đệm 77 và "hi!".

nếu bạn cần kết quả dưới dạng ví dụ sử dụng chuỗi của std :: stringstream thay vì std :: cout object.

ps: có trách nhiệm tập tin tiêu đề <iomanip>

+0

vâng ngay bây giờ với ví dụ rõ ràng hơn là –

+0

Câu trả lời thú vị. Bất kỳ cơ hội nào chúng ta có thể nhận được điều này dưới dạng một ví dụ làm việc tối thiểu? Cảm ơn – puk

-3

Tạo một chuỗi mới của 10 không gian, và làm việc ngược trong cả chuỗi.

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; 
} 
29
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; 
} 
+0

Tôi thích giải pháp này bởi vì trên nhiều dòng hệ điều hành Linux, dòng chuỗi yêu cầu phụ thuộc GLIBC không có sẵn. –

+2

chèn (0, ...) là một ý tưởng tồi bởi vì nó là chậm, bạn cần phải sao chép chuỗi mỗi khi bạn chèn một char mới. – arhuaco

7

bạn có thể tạo một chuỗi chứa N không gian bằng cách gọi

string(N, ' '); 

Vì vậy, bạn có thể làm như thế này:

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

Có một cách tốt đẹp và đơn giản :)

const int required_pad = 10; 

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

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

sai. cần phải là 10 - chiều dài 123 –

+0

Có, tôi đã hiểu sai yêu cầu. đã sửa. –

1

Làm thế nào về:

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

Bạn có thể sử dụng nó như thế này:

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

Cách đơn giản nhất tôi có thể nghĩ sẽ có một stringstream:

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

foo bây giờ nên được đệm.

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