2012-05-04 28 views
6

Tôi đang học C++ và nhận dự án để gửi tam giác của pascal đến đầu ra (sau n-hàng tính)., Nhận đầu ra như thế này, được lưu trữ trong một chuỗi "buffer"Sử dụng chuỗi đầu vào để thụt lề/đầu ra trung tâm

1 
1 1 
1 2 1 
1 3 3 1 

Nhưng những gì tôi muốn là khá

1 
    1 1 
    1 2 1 
1 3 3 1 

ý tưởng của tôi là: tính toán sự khác biệt của dòng cuối cùng và thời gian dòng hiện tại (tôi biết rằng người cuối cùng là dài nhất). Sau đó, pad mỗi hàng bằng cách sử dụng dấu cách (một nửa của sự khác biệt chiều dài dòng). Vấn đề của tôi bây giờ là:

  • tôi đã không nhận được công trình như thế nào getline, không phải làm thế nào tôi có thể trích xuất một cụ thể (-> cuối cùng) dòng
  • Tôi không biết và không thể tìm thấy làm thế nào để chỉnh sửa một dòng cụ thể trong một chuỗi liên kết

Bằng cách nào đó tôi có cảm giác rằng tôi không phải là cách tốt nhất khi sử dụng chuỗi.

Vì vậy, đây là một câu hỏi phổ biến: Bạn giải quyết vấn đề này như thế nào và nếu có thể với chuỗi video - cách thực hiện?

+1

http://www.cplusplus.com/reference/iostream/manipulators/setw/ hãy xem một số này – v01d

+0

Chỉ cần rõ ràng, liệu bạn có tính giá trị của bản thân và bản in của mình không? Hay bạn phân tích chúng và sau đó in lại? – Benj

+0

Tôi tự tính chúng, tôi sẽ xem xét setw, có vẻ là một cách tốt đẹp :-) – AnatraIlDuck

Trả lời

2

Để biết thụt đầu dòng của dòng đầu tiên , bạn sẽ cần phải biết số dòng trong đầu vào. Vì vậy, trước tiên bạn phải đọc trong tất cả các đầu vào. Tôi đã chọn sử dụng một vectơ để lưu trữ các giá trị cho sự tiện lợi của hàm thành viên .size() sẽ cung cấp tổng số dòng sau khi đọc trong tất cả đầu vào.

#include<iostream> 
#include<sstream> 
#include<vector> 
#include<iomanip> // For setw 
using namespace std; 
int main() 
{ 
    stringstream ss; 
    vector<string> lines; 
    string s; 

    //Read all of the lines into a vector 
    while(getline(cin,s)) 
    lines.push_back(s); 

    // setw() - sets the width of the line being output 
    // right - specifies that the output should be right justified 
    for(int i=0,sz=lines.size();i<sz;++i) 
    ss << setw((sz - i) + lines[i].length()) << right << lines[i] << endl; 

    cout << ss.str(); 
    return 0; 
} 

Trong ví dụ này, tôi đang sử dụng setw để đặt chiều rộng của dòng được căn phải. Phần đệm ở phía bên trái của chuỗi được cho bởi (sz - i) trong đó sz là tổng số dòng và i là dòng hiện tại. Do đó, mỗi dòng tiếp theo có 1 khoảng trống nhỏ hơn ở phía bên tay trái.

Tiếp theo tôi cần phải thêm vào kích thước ban đầu của dòng (dòng [i] .length()), nếu không dòng sẽ không chứa đủ không gian cho chuỗi kết quả để có đệm đúng trên tay trái bên.

setw((sz - i) + lines[i].length()) 

Hy vọng điều này sẽ hữu ích!

0

Nếu bạn có quyền truy cập vào mã mà viết đầu ra ban đầu, và nếu bạn biết số dòng N bạn đang viết, bạn chỉ có thể làm:

for(int i = 0; i < N; ++i) { 
    for(int j = 0; j < N - 1 - i; ++j) 
     sstr << " "; // write N - 1 - i spaces, no spaces for i == N. 
    // now write your numbers the way you currently do 
} 
+1

tôi nghi ngờ nó sẽ làm việc khi N tăng và hai con số chữ số đi vào chơi. Nó sẽ? – nims

+1

@nims Chắc chắn, bạn sẽ cần tính toán 'width = max (chọn (N, k)% 10' để lấy số chữ số và viết (N - 1 - i) * khoảng trắng rộng.Quan điểm của tôi đơn giản là dễ dàng kết hợp định dạng với tính toán hơn là định dạng đầu ra sau khi tính toán. – TemplateRex

+0

bằng cách nào đó tôi sẽ tìm thấy nó đẹp hơn để đầu tiên tính toán các giá trị và sau đó định dạng đầu ra ... – AnatraIlDuck

Các vấn đề liên quan