2010-03-12 26 views
23

Điều đầu tiên xuất hiện trong tâm trí của tôi là thực hiện một loạt các \ t, nhưng điều đó sẽ làm cho các từ bị sai lệch nếu bất kỳ từ nào dài hơn bất kỳ từ nào khác bởi một vài ký tự.Làm cách nào để sắp xếp chính xác đầu ra thành các cột?

Ví dụ, tôi muốn có một cái gì đó như:

Name Last Name   Middle initial 
Bob  Jones    M 
Joe  ReallyLongLastName T 

Thay vào đó, bằng cách bao gồm chỉ "\ t" 's trong bản Tuyên Bố cout của tôi, tôi chỉ có thể quản lý để có được

Name Last Name   Middle initial 
Bob  Jones    M 
Joe  ReallyLongLastName    T 

hoặc

Name Last Name   Middle initial 
Bob  Jones M 
Joe  ReallyLongLastName T 

Tôi còn cần phải làm gì nữa?

EDIT: Vì vậy, tôi nhận được rằng trước tiên tôi nên đếm chiều rộng tối đa của mỗi cột tôi muốn hiển thị, và sau đó thêm không gian đệm phù hợp. Nhưng làm thế nào, và với những chức năng gì, tôi có thể làm việc này không? Tôi có nên chỉ đếm số lượng ký tự trong một chuỗi và sau đó đi từ đó?

Trả lời

28

Sử dụng std::setw từ <iomanip>

ví dụ

using std::cout; 
using std::setw; 

cout << setw(10) << "This" << 
     setw(10) << "is" << 
     setw(10) << "a" << 
     setw(10) << "test" << '\n'; 

Output:

 This  is   a  test 
+7

Tôi nghĩ bạn cũng nên sử dụng 'cout << left' –

+0

Nhờ cả bạn và Alexandre! Cuối cùng tôi đã có những gì tôi muốn :) – wrongusername

7

Bạn cũng nên tính đến các trình chỉnh sửa/người xem khác nhau hiển thị văn bản có chiều rộng tab khác nhau. Vì vậy, việc sử dụng các tab, văn bản trông được sắp xếp độc đáo trong một trình xem có thể trông xấu hơn trong một trình xem khác.

Nếu bạn thực sự muốn sắp xếp tốt, bạn có thể sử dụng khoảng trống, và bạn có thể thực hiện hai lần trên văn bản của mình: đầu tiên đếm chiều rộng tối đa của mỗi cột, sau đó thêm số lượng không gian đệm phù hợp cho mỗi cột. Đối với sau này, bạn cũng có thể sử dụng một thợ may thực hiện cuộc gọi printf.

Cập nhật: Đếm chiều rộng cột về cơ bản có nghĩa là đếm độ dài của chuỗi bạn có trong cột nhất định. Nó có thể được thực hiện bằng cách sử dụng string::length() hoặc strlen(), tùy thuộc vào việc bạn đang sử dụng std::string hoặc char* (trước đây được khuyến nghị). Sau đó, bạn chỉ cần lặp qua tất cả các từ trong cột đó, so sánh độ dài từ tối đa bạn có cho đến thời điểm này và nếu từ hiện tại dài hơn, bạn đặt độ dài đó thành giá trị CPC tối đa mới. Nếu bạn lưu trữ các từ của bạn trong một container STL, bạn thậm chí có thể sử dụng std::max_element algorithm để thực hiện công việc cho bạn với một cuộc gọi chức năng duy nhất.

+0

Cảm ơn! Làm thế nào tôi có thể đếm chiều rộng tối đa của mỗi cột? – wrongusername

+0

@wrongusername xin xem cập nhật của tôi. –

+0

Cảm ơn bạn rất nhiều! Đó là một imo triển khai linh hoạt hơn: P – wrongusername

6

Sử dụng printf() đệm với trừ cờ cho trái Alignement

printf("%-8s%-21s%-7s%-6s\n", "Name", "Last Name", "Middle", "initial"); 
printf("%-8s%-21s%-7s%-6s\n", "Bob", "Jones", "M", ""); 
printf("%-8s%-21s%-7s%-6s\n", "Joe", "ReallyLongLastName", "T", ""); 

nào sản xuất:

Name Last Name   Middle initial 
Bob  Jones    M 
Joe  ReallyLongLastName T 
+2

Đủ công bằng, nhưng với các thẻ, có lẽ giải pháp iostream sẽ được ưu tiên hơn. – Clifford

2

Đối với những tình huống như thế này thường là hai đèo được yêu cầu: một để khám phá chiều rộng tối đa của mỗi cột và cột khác để thực hiện in. Đối với iostream tiêu chuẩn, bạn có thể sử dụng quy trình width() để iostream xử lý phần đệm cho bạn một cách tự động.

0

Sử dụng định dạng chuỗi (từ stdio) để hiển thị từng dòng.

http://www.cppreference.com/wiki/c/io/printf

Nó sẽ cho phép bạn thiết lập độ rộng lĩnh vực tối thiểu và do đó nó sẽ pad phần còn lại của từng lĩnh vực cho bạn.

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