Jawaban:
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.
-
) untuk membuatnya sesuai dengan panjang yang ditentukan.
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
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'
Menggunakan printf
Anda 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;
ostream_iterator<char>(cout)
! Sebagai gantinya, gunakan ostreambuf_iterator<char>(cout)
! Perbedaan kinerja harus agak besar.
std::cout.write(s.data(), 8)
. Atau dalam C ++ modern std::cout << std::string_view{s.data(), 8}
,.
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)
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.
std::cout << someStr.substr(0,8);
jauh lebih jelas.
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.