Bagaimana cara memformat string menggunakan printf () untuk mendapatkan panjang yang sama dalam output?

97

Saya memiliki dua fungsi, satu yang menghasilkan pesan suka Starting initialization...dan yang lainnya yang memeriksa kode dan keluaran yang dikembalikan "Ok", "Warning"atau "Error". Namun, keluaran yang dihasilkan memiliki panjang yang berbeda:

Starting initialization...Ok.
Checking init scripts...Ok.

Bagaimana saya bisa mendapatkan sesuatu seperti ini:

Starting initialization...       Ok.
Checking init scripts...         Ok.
psihodelia.dll
sumber

Jawaban:

164

Anda dapat menentukan lebar pada bidang string, misalnya

printf("%-20s", "initialization...");

dan apa pun yang dicetak dengan bidang itu akan diberi bantalan kosong dengan lebar yang Anda tunjukkan.

The -kiri-membenarkan teks dalam bidang itu.

Carl Smotricz
sumber
130
Sayangnya, saya tidak cukup pintar untuk menghitung setinggi itu. Namun, saya percaya si penanya cukup cerdas untuk memperkirakan dari contoh saya :)
Carl Smotricz
3
Bagaimana dengan hak yang dibenarkan? Tidak ada bendera yang disebutkan di K&R
Ungeheuer
9
Rata kanan adalah default. Tanpa a -, data Anda akan diratakan ke kanan dalam bidang yang lebarnya Anda tentukan.
Carl Smotricz
25

printfmemungkinkan pemformatan dengan penentu lebar. misalnya


printf( "%-30s %s\n", "Starting initialization...", "Ok." );

Anda akan menggunakan penentu lebar negatif untuk menunjukkan pembenaran kiri karena defaultnya adalah menggunakan pembenaran kanan.

PP.
sumber
20

Selain itu, jika Anda menginginkan fleksibilitas dalam memilih width, Anda dapat memilih salah satu dari dua format berikut (dengan atau tanpa pemotongan):

int width = 30;
//no truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization...     Ok."

//truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." ); 
// output is "Starting initialization... Ok."
keseimbangan hidup
sumber
13

Ada juga %npengubah yang dapat membantu dalam keadaan tertentu. Ini mengembalikan kolom tempat string itu sejauh ini. Contoh: Anda ingin menulis beberapa baris dengan lebar baris pertama seperti tabel.

int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);

for(i=0; i<6; i++)
   printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);

akan mencetak 2 kolom lebar yang sama panjang apapun dua string header1dan header2mungkin memiliki. Saya tidak tahu apakah semua implementasi memiliki %ntetapi Solaris dan Linux melakukannya.

Patrick Schlüter
sumber
Solusi ini berfungsi, tetapi siapa pun yang mengambil ini dan memasukkannya ke dalam kode mereka harus waspada akan risiko menimbulkan kerentanan memori .
Matthew Cole
0

Ada juga solusi berteknologi rendah untuk menghitung penambahan spasi dengan tangan agar pesan Anda sejajar. Tidak ada yang menghalangi Anda untuk memasukkan beberapa spasi tambahan dalam string pesan Anda.

Carl Smotricz
sumber
-2

Mulailah dengan penggunaan Tab, pengubah karakter \ t . Ini akan maju ke lokasi tetap (kolom, istilah terminal). Namun, tidak membantu jika ada perbedaan lebih dari lebar kolom (4 karakter, jika saya ingat dengan benar).

Untuk memperbaikinya, tulis item "OK / NOK" Anda menggunakan jumlah Tab yang tetap (5? 6 ?, coba saja), lalu kembalikan ( \ r ) tanpa baris baru, dan tulis pesan Anda.

jpinto3912
sumber
5
Selalu ada bahaya bahwa string lebih panjang dari tab stop sehingga memaksa tab dan teks yang dihasilkan menjadi tidak sejajar.
PP.
Tidak juga ... pertama tulis tab OK / NOK, lalu / r, sekarang tulis frase, sekarang / n. Frasa tersebut dapat menimpa OK / NOK. Tetapi cara Anda jauh lebih baik, saya tidak tahu tentang pembenaran negatif.
jpinto3912