Está compilando porque printf
no es de tipo seguro, ya que utiliza argumentos variables en el sentido C 1 . printf
no tiene opción para std::string
, solo una cadena de estilo C. Usar algo más en lugar de lo que espera definitivamente no le dará los resultados que desea. En realidad es un comportamiento indefinido, por lo que cualquier cosa podría suceder.
La forma más fácil de solucionar esto, ya que está usando C ++, es imprimirlo normalmente std::cout
, ya std::string
que lo soporta mediante la sobrecarga del operador:
std::cout << "Follow this command: " << myString;
Si, por alguna razón, necesita extraer la cadena de estilo C, puede usar el c_str()
método de std::string
para obtener una const char *
terminación nula. Usando tu ejemplo:
#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;
}
Si desea una función similar printf
, pero segura, busque plantillas variadas (C ++ 11, compatible con todos los compiladores principales a partir de MSVC12). Puedes encontrar un ejemplo de uno aquí . No sé nada implementado de esa manera en la biblioteca estándar, pero puede haber en Boost, específicamente boost::format
.
[1]: Esto significa que puede pasar cualquier número de argumentos, pero la función depende de usted para decirle el número y los tipos de esos argumentos. En el caso de printf
, eso significa una cadena con información de tipo codificada como %d
significado int
. Si miente sobre el tipo o número, la función no tiene una forma estándar de conocimiento, aunque algunos compiladores tienen la capacidad de verificar y dar advertencias cuando miente.