Rumah >pembangunan bahagian belakang >C++ >Mengapa printf Tidak Berfungsi Terus dengan std::string, dan Apakah Alternatifnya?

Mengapa printf Tidak Berfungsi Terus dengan std::string, dan Apakah Alternatifnya?

DDD
DDDasal
2024-12-18 13:31:10233semak imbas

Why Doesn't printf Work Directly with std::string, and What Are the Alternatives?

Cara menggunakan printf dengan std::string

Adalah boleh difahami untuk keliru apabila menggunakan printf dengan std::string, sebagai ia mungkin kelihatan seperti mereka harus bekerja bersama-sama dengan lancar kerana rentetan ialah ahli ruang nama std. Walau bagaimanapun, ini tidak berlaku kerana sifat printf jenis-tidak selamat.

Printf menggunakan argumen boleh ubah dalam erti kata C, yang bermaksud anda boleh menghantar sebarang bilangan argumen, tetapi ia bergantung kepada anda untuk memberitahunya bilangan dan jenis hujah tersebut. Dalam kes printf, ini dilakukan melalui rentetan dengan maklumat jenis yang dikodkan, seperti %d untuk int. Jika anda berbohong tentang jenis atau bilangan argumen, fungsi itu tidak mempunyai cara standard untuk mengetahui dan akan mempamerkan tingkah laku yang tidak ditentukan.

Dengan std::string, yang merupakan binaan C selamat jenis, printf tidak mempunyai pilihan untuk itu, hanya rentetan gaya C. Menggunakan sesuatu yang lain sebagai ganti daripada apa yang diharapkan sudah tentu tidak akan memberikan anda hasil yang diingini.

Pembetulan mudah untuk isu ini ialah mencetak seperti biasa menggunakan std::cout, memandangkan std::string menyokong beban berlebihan operator untuk ini tujuan:

std::cout << "Follow this command: " << myString;

Jika anda perlu mengekstrak rentetan gaya C atas sebab tertentu, anda boleh menggunakan kaedah c_str() std::string untuk mendapatkan const char * yang ditamatkan nol. Berikut ialah contoh yang dikemas kini menggunakan c_str():

printf("Follow this command: %s", myString.c_str()); // note the use of c_str

Untuk fungsi selamat jenis yang berkelakuan serupa dengan printf, pertimbangkan untuk menggunakan templat variadic (diperkenalkan dalam C 11). Anda boleh menemui satu contoh [di sini](https://en.cppreference.com/w/cpp/utility/variadic). Selain itu, Boost menawarkan perpustakaan yang berpotensi berguna yang dipanggil boost::format.

Atas ialah kandungan terperinci Mengapa printf Tidak Berfungsi Terus dengan std::string, dan Apakah Alternatifnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn