Printf bên trái với khoảng trắng


114

Làm cách nào để tôi có thể đệm một chuỗi có dấu cách ở bên trái khi sử dụng printf?

Ví dụ, tôi muốn in "Hello" với 40 khoảng trắng trước nó.

Ngoài ra, chuỗi tôi muốn in bao gồm nhiều dòng. Tôi có cần in từng dòng riêng biệt không?

CHỈNH SỬA: Nói rõ ràng, tôi muốn in chính xác 40 khoảng trắng trước mỗi dòng.

Câu trả lời:


125

Nếu bạn muốn từ "Xin chào" in trong một cột rộng 40 ký tự, với khoảng cách đệm bên trái, hãy sử dụng cách sau.

char *ptr = "Hello";
printf("%40s\n", ptr);

Điều đó sẽ cung cấp cho bạn 35 dấu cách, sau đó là từ "Xin chào". Đây là cách bạn định dạng nội dung khi bạn biết bạn muốn cột rộng như thế nào, nhưng dữ liệu thay đổi (tốt, đó là một cách bạn có thể làm).

Nếu bạn biết bạn muốn có chính xác 40 khoảng trắng thì một số văn bản, chỉ cần lưu 40 khoảng trắng trong một hằng số và in chúng. Nếu bạn cần in nhiều dòng, hãy sử dụng nhiều printfcâu lệnh như câu trên hoặc thực hiện theo vòng lặp, thay đổi giá trị của ptrmỗi lần.


3
dunno quá nhiều về định dạng cờ. nhưng tôi nghi ngờ printf ("% 40s% s \ n", "", ptr); có thể được sử dụng để đệm nó với 40 không gian quá?
Johannes Schaub - litb

Có, điều đó sẽ luôn cung cấp cho bạn 40 khoảng trắng trước nội dung của con trỏ. Đó là một giải pháp hay, nhưng nếu bạn phải làm nhiều, tôi nghĩ một hằng số với 40 dấu cách sẽ nhanh hơn. Tôi không biết liệu trình biên dịch có thể tối ưu hóa các định dạng printf hay không.
Bill the Lizard,

38
Ngoài ra, nếu bạn có một biến int 'n' chứa số khoảng trắng cần bao gồm, bạn có thể sử dụng: printf ("% * s% s \ n", n, "", ptr); để nhận được một số khoảng trắng thay đổi.
Jonathan Leffler

Và, để giải quyết phần cuối cùng của Câu hỏi: vâng, nếu bạn muốn mỗi dòng dữ liệu được in với 40 khoảng trắng ở đầu, thì bạn cần phải phân đoạn dữ liệu để mỗi dòng được in riêng biệt.
Jonathan Leffler

4
@Jonathan Leffler: tất nhiên trình biên dịch có thể tối ưu hóa các định dạng printf. Ví dụ: GCC tối ưu hóa printf ("% s \ n", foo) và thay thế nó bằng put (foo).
sam hocevar

73

Tôi sử dụng hàm này để thụt lề đầu ra (ví dụ: để in cấu trúc cây). Là indentsố khoảng trắng trước chuỗi.

void print_with_indent(int indent, char * string)
{
    printf("%*s%s", indent, "", string);
}

7
Tôi thích cách bạn sử dụng nối chuỗi theo nghĩa đen để giữ thụt lề tách biệt với phần còn lại của định dạng printf. Một gợi ý: sử dụng một chuỗi trống thay vì một khoảng trắng cho chuỗi thụt lề. Bằng cách đó, thụt lề == 0 sẽ hoạt động như mong đợi. (tức là, printf(..., indent, "", ...))
ɲeuroburɳ

Lưu ý, Ray Hulha đã loại bỏ sự nối chuỗi theo nghĩa đen, rõ ràng là để khắc phục "sự cố trình biên dịch".
mwfearnley

42
int space = 40;
printf("%*s", space, "Hello");

Câu lệnh này sẽ dành một hàng gồm 40 ký tự, in chuỗi ở cuối hàng (loại bỏ các khoảng trắng thừa sao cho tổng độ dài hàng không đổi là 40). Tương tự có thể được sử dụng cho các ký tự và số nguyên như sau:

printf("%*d", space, 10);
printf("%*c", space, 'x');

Phương pháp này sử dụng một tham số để xác định khoảng trắng rất hữu ích khi yêu cầu một số lượng biến khoảng cách. Các câu lệnh này sẽ vẫn hoạt động với các ký tự nguyên như sau:

printf("%*d", 10, 10);
printf("%*c", 20, 'x');
printf("%*s", 30, "Hello");

Hy vọng điều này sẽ giúp một người như tôi trong tương lai.


Tôi đã error: empty character constantcho ''. Có nên không ' '?
Jin Kwon

Có, nó nên.
shjeff

@JinKwon bất kỳ nhân vật nào, cũng "Hello"có thể là bất cứ thứ gì, anh ấy lẽ ra phải lấy một ví dụ
joe pelletier

19

Nếu bạn muốn có chính xác 40 khoảng trắng trước chuỗi thì bạn chỉ cần thực hiện:

printf("                                        %s\n", myStr );

Nếu quá bẩn, bạn có thể làm (nhưng sẽ chậm hơn so với việc gõ thủ công 40 dấu cách): printf("%40s%s", "", myStr );

Nếu bạn muốn chuỗi được xếp hàng ở cột 40 (có nghĩa là có tới 39 khoảng trắng tiếp tục sao cho ký tự gần nhất bên phải nằm trong cột 40) thì hãy làm như sau: printf("%40s", myStr);

Bạn cũng có thể đặt "tối đa" 40 dấu cách SAU chuỗi bằng cách thực hiện: printf("%-40s", myStr);


2
thích nhận xét này cho khoảng trắng sau chuỗi
một
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.