Mengkompilasi karena printf
bukan tipe aman, karena menggunakan argumen variabel dalam pengertian C 1 . printf
tidak memiliki opsi untuk std::string
, hanya string gaya-C. Menggunakan sesuatu yang lain di tempat yang diharapkannya pasti tidak akan memberi Anda hasil yang Anda inginkan. Ini sebenarnya perilaku yang tidak terdefinisi, sehingga apa pun bisa terjadi.
Cara termudah untuk memperbaikinya, karena Anda menggunakan C ++, adalah mencetaknya dengan normal std::cout
, karena std::string
mendukungnya melalui overloading operator:
std::cout << "Follow this command: " << myString;
Jika, karena alasan tertentu, Anda perlu mengekstrak string gaya-C, Anda dapat menggunakan c_str()
metode std::string
untuk mendapatkan const char *
yang diakhiri dengan null. Menggunakan contoh Anda:
#include <iostream>
#include <string>
#include <stdio.h>
int main()
{
using namespace std;
string myString = "Press ENTER to quit program!";
cout << "Come up and C++ me some time." << endl;
printf("Follow this command: %s", myString.c_str()); //note the use of c_str
cin.get();
return 0;
}
Jika Anda menginginkan fungsi yang seperti printf
, tetapi mengetikkan safe, lihatlah templat variadic (C ++ 11, yang didukung pada semua kompiler utama pada MSVC12). Anda dapat menemukan contohnya di sini . Tidak ada yang saya tahu tentang implementasi seperti itu di perpustakaan standar, tetapi mungkin ada di Boost, khususnya boost::format
.
[1]: Ini berarti Anda bisa memberikan sejumlah argumen, tetapi fungsinya bergantung pada Anda untuk memberi tahu nomor dan jenis argumen itu. Dalam kasus ini printf
, itu berarti sebuah string dengan tipe informasi yang dikodekan seperti %d
makna int
. Jika Anda berbohong tentang jenis atau angka, fungsi tidak memiliki cara standar untuk mengetahui, meskipun beberapa penyusun memiliki kemampuan untuk memeriksa dan memberikan peringatan ketika Anda berbohong.