printf
C anlamda 1 değişken değişkenleri kullandığından tür güvenli olmadığından derleniyor . printf
seçeneği yoktur std::string
, yalnızca C stili bir dize vardır. Beklediği şeyin yerine başka bir şey kullanmak kesinlikle istediğiniz sonuçları vermeyecektir. Aslında tanımsız bir davranış, bu yüzden her şey olabilir.
Bunu düzeltmenin en kolay yolu, C ++ kullandığınız için, normalde ile yazdırmaktır std::cout
, çünkü std::string
operatör aşırı yüklenmesi ile bunu destekler:
std::cout << "Follow this command: " << myString;
Herhangi bir nedenden ötürü, C stili dize ayıklamanız gerekirse , boş sonlandırılmış bir c_str()
yöntem elde std::string
etmek için yöntemini kullanabilirsiniz const char *
. Örneğinizi kullanma:
#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;
}
Benzeri printf
ancak güvenli yazılan bir işlev istiyorsanız , değişken şablonlara bakın (C ++ 11, MSVC12'den itibaren tüm büyük derleyicilerde desteklenir). Burada bir örnek bulabilirsiniz . Standart kütüphanede böyle uygulandığını bildiğim hiçbir şey yok, ancak özellikle Boost'da olabilir boost::format
.
[1]: Bu, istediğiniz sayıda bağımsız değişkeni iletebileceğiniz anlamına gelir, ancak işlev, bu bağımsız değişkenlerin sayısını ve türlerini belirtmeniz konusunda size güvenir. Durumunda printf
, bu kodlanmış tür bilgisine sahip bir dize anlamına gelir.%d
anlam anlamına gelir int
. Tür veya sayı hakkında yalan söylüyorsanız, bazı derleyicilerin yalan söylediğinde kontrol etme ve uyarı verme yeteneğine sahip olmasına rağmen, işlevin standart bir bilme yolu yoktur.