Printf pad kiri dengan spasi

114

Bagaimana cara mengisi string dengan spasi di sebelah kiri saat menggunakan printf?

Misalnya, saya ingin mencetak "Halo" dengan 40 spasi sebelumnya.

Juga, string yang ingin saya cetak terdiri dari beberapa baris. Apakah saya perlu mencetak setiap baris secara terpisah?

EDIT: Untuk memperjelas, saya ingin tepat 40 spasi dicetak sebelum setiap baris.

titaniumdecoy
sumber

Jawaban:

125

Jika Anda ingin kata "Halo" dicetak dalam kolom dengan lebar 40 karakter, dengan spasi di sebelah kiri, gunakan yang berikut ini.

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

Itu akan memberi Anda 35 spasi, lalu kata "Halo". Ini adalah cara Anda memformat barang ketika Anda tahu seberapa lebar kolom yang Anda inginkan, tetapi datanya berubah (yah, itu salah satu cara Anda dapat melakukannya).

Jika Anda tahu Anda menginginkan tepat 40 spasi kemudian beberapa teks, cukup simpan 40 spasi dalam konstanta dan cetak. Jika Anda perlu mencetak banyak baris, gunakan beberapa printfpernyataan seperti di atas, atau lakukan dalam satu lingkaran, ubah nilainya ptrsetiap kali.

Bill the Lizard
sumber
3
tidak tahu terlalu banyak tentang bendera format. tetapi saya curiga printf ("% 40s% s \ n", "", ptr); dapat digunakan untuk melapisinya dengan 40 spasi juga?
Johannes Schaub - litb
Ya, itu akan selalu memberi Anda 40 spasi sebelum konten penunjuk. Itu solusi yang bagus, tetapi jika Anda harus sering melakukannya, saya pikir konstanta dengan 40 spasi akan lebih cepat. Saya tidak tahu apakah kompiler dapat mengoptimalkan format printf.
Bill the Lizard
38
Juga, jika Anda memiliki variabel int 'n' yang berisi jumlah spasi untuk dimasukkan, Anda dapat menggunakan: printf ("% * s% s \ n", n, "", ptr); untuk mendapatkan jumlah spasi yang bervariasi.
Jonathan Leffler
Dan, untuk menjawab bagian terakhir dari Q: ya, jika Anda ingin setiap baris data dicetak dengan 40 spasi di depan, maka Anda perlu melakukan segmentasi data sehingga setiap baris dicetak secara terpisah.
Jonathan Leffler
4
@Jonathan Leffler: tentu saja kompilator dapat mengoptimalkan format printf. Misalnya, GCC mengoptimalkan printf ("% s \ n", foo) dan menggantinya dengan put (foo).
sam hocevar
73

Saya menggunakan fungsi ini untuk membuat indentasi keluaran saya (misalnya untuk mencetak struktur pohon). The indentadalah jumlah spasi sebelum string.

void print_with_indent(int indent, char * string)
{
    printf("%*s%s", indent, "", string);
}
jk_
sumber
7
Saya suka penggunaan rangkaian literal string untuk menjaga indentasi terpisah dari format printf lainnya. Satu saran: gunakan string kosong alih-alih satu spasi untuk string indentasi. Dengan begitu indentasi == 0 akan berfungsi seperti yang diharapkan. (ie, printf(..., indent, "", ...))
ɲeuroburɳ
Catatan, Ray Hulha telah menghapus penggabungan string literal, jelas untuk memperbaiki "masalah kompilator".
mwfearnley
42
int space = 40;
printf("%*s", space, "Hello");

Pernyataan ini akan menyimpan satu baris 40 karakter, mencetak string di akhir baris (menghapus spasi ekstra sehingga total panjang baris konstan pada 40). Hal yang sama dapat digunakan untuk karakter dan bilangan bulat sebagai berikut:

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

Metode ini menggunakan parameter untuk menentukan spasi berguna di mana sejumlah variabel diperlukan. Pernyataan ini masih akan bekerja dengan literal integer sebagai berikut:

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

Semoga ini bisa membantu seseorang seperti saya di masa depan.

Terima Foc
sumber
Saya error: empty character constantdapat ''. Bukankah seharusnya begitu ' '?
Jin Kwon
Ya, seharusnya.
shjeff
@JinKwon karakter apa pun, sama seperti "Hello"apa pun, dia seharusnya menggunakan contoh
joe pelletier
18

Jika Anda ingin tepat 40 spasi sebelum string maka Anda harus melakukan:

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

Jika itu terlalu kotor, Anda dapat melakukannya (tetapi akan lebih lambat daripada mengetik secara manual 40 spasi): printf("%40s%s", "", myStr );

Jika Anda ingin string berbaris di kolom 40 (yaitu, memiliki hingga 39 spasi yang diproses sedemikian rupa sehingga karakter paling kanan ada di kolom 40) maka lakukan ini: printf("%40s", myStr);

Anda juga dapat menempatkan "hingga" 40 spasi SETELAH string dengan melakukan: printf("%-40s", myStr);

Kotak sabun
sumber
2
sukai komentar ini untuk spasi setelah string
oneat