Apakah ada cara untuk menentukan berapa banyak karakter string yang akan dicetak menggunakan printf ()?

127

Apakah ada cara untuk menentukan berapa banyak karakter string yang akan dicetak (mirip dengan tempat desimal dalam ints)?

printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars");

Ingin mencetak: Here are the first 8 chars: A string

TTT
sumber

Jawaban:

226

Cara dasarnya adalah:

printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

Cara lainnya, yang seringkali lebih berguna, adalah:

printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");

Di sini, Anda menetapkan panjang sebagai argumen int untuk printf (), yang memperlakukan '*' dalam format sebagai permintaan untuk mendapatkan panjang dari sebuah argumen.

Anda juga dapat menggunakan notasi:

printf ("Here are the first 8 chars: %*.*s\n",
        8, 8, "A string that is more than 8 chars");

Ini juga analog dengan notasi "% 8.8s", tetapi sekali lagi memungkinkan Anda untuk menentukan panjang minimum dan maksimum saat runtime - lebih realistis dalam skenario seperti:

printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);

Spesifikasi POSIX untuk printf()mendefinisikan mekanisme ini.

Jonathan Leffler
sumber
2
Untuk contoh terakhir: Bagaimana jika string yang disalin lebih pendek dari minlen?
pencari kebenaran
4
Keluarannya akan kosong dengan bantalan (di sebelah kiri kecuali jika Anda menambahkan a -) untuk membuatnya sesuai dengan panjang yang ditentukan.
Jonathan Leffler
13
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

% 8s akan menentukan lebar minimum 8 karakter. Anda ingin memotong di 8, jadi gunakan% .8s.

Jika Anda ingin selalu mencetak tepat 8 karakter, Anda dapat menggunakan% 8.8s

perkembangan kegilaan
sumber
13

Selain menentukan jumlah karakter yang tetap, Anda juga dapat menggunakan *yang berarti printf mengambil jumlah karakter dari argumen:

#include <stdio.h>

int main(int argc, char *argv[])
{
        const char hello[] = "Hello world";
        printf("message: '%.3s'\n", hello);
        printf("message: '%.*s'\n", 3, hello);
        printf("message: '%.*s'\n", 5, hello);
        return 0;
}

Cetakan:

message: 'Hel'
message: 'Hel'
message: 'Hello'
hlovdal.dll
sumber
11

Menggunakan printfAnda bisa dilakukan

printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

Jika Anda menggunakan C ++, Anda dapat memperoleh hasil yang sama menggunakan STL:

using namespace std; // for clarity
string s("A string that is more than 8 chars");
cout << "Here are the first 8 chars: ";
copy(s.begin(), s.begin() + 8, ostream_iterator<char>(cout));
cout << endl;

Atau, kurang efisien:

cout << "Here are the first 8 chars: " <<
        string(s.begin(), s.begin() + 8) << endl;
Peter Alexander
sumber
1
Catatan: jangan tidak menggunakan ostream_iterator<char>(cout)! Sebagai gantinya, gunakan ostreambuf_iterator<char>(cout)! Perbedaan kinerja harus agak besar.
Dietmar Kühl
Cara yang lebih efisien untuk bukan menggunakan: std::cout.write(s.data(), 8). Atau dalam C ++ modern std::cout << std::string_view{s.data(), 8},.
Artyer
4

Cetak empat karakter pertama:

printf("%.4s\n", "A string that is more than 8 chars");

Lihat tautan ini untuk informasi lebih lanjut (periksa .precision -section)

Anssi
sumber
4

Di C ++ itu mudah.

std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));

EDIT: Ini juga lebih aman untuk menggunakan ini dengan iterator string, jadi Anda tidak kehabisan akhir. Saya tidak yakin apa yang terjadi dengan printf dan string yang terlalu pendek, tapi saya rasa ini mungkin lebih aman.

Chris H.
sumber
32
ha, ya itu "mudah". C ++ selalu terlihat seperti kecelakaan mobil.
Presiden James K. Polk
Anda masih dapat melakukan printf () di c ++ :)
StasM
6
Saya pikir ini adalah sarkasme. std::cout << someStr.substr(0,8);jauh lebih jelas.
MSalters
2
@MSalters Anda harus memposting itu sebagai jawaban.
Jonathan Mee
3

printf (..... "%. 8s")

pm100
sumber
1

Di C ++, saya melakukannya dengan cara ini:

char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;

Harap dicatat ini tidak aman karena ketika melewati argumen kedua saya bisa melampaui ukuran string dan menghasilkan pelanggaran akses memori. Anda harus menerapkan pemeriksaan Anda sendiri untuk menghindari hal ini.

rodolk
sumber