Ele está compilando porque printf
não é seguro para o tipo, pois usa argumentos variáveis no sentido C 1 . printf
não tem opção para std::string
, apenas uma string no estilo C. Usar outra coisa no lugar do que ele espera definitivamente não lhe dará os resultados desejados. Na verdade, é um comportamento indefinido, para que tudo possa acontecer.
A maneira mais fácil de corrigir isso, já que você está usando C ++, é imprimindo normalmente com std::cout
, uma vez std::string
que suporta isso através da sobrecarga do operador:
std::cout << "Follow this command: " << myString;
Se, por algum motivo, você precisar extrair a seqüência de caracteres no estilo C, poderá usar o c_str()
método de std::string
para obter uma const char *
terminação nula. Usando seu exemplo:
#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;
}
Se você deseja uma função semelhante printf
, mas com segurança, procure modelos variados (C ++ 11, suportado em todos os principais compiladores a partir do MSVC12). Você pode encontrar um exemplo de um aqui . Não há nada que eu saiba sobre isso implementado na biblioteca padrão, mas pode haver no Boost, especificamente boost::format
.
[1]: Isso significa que você pode transmitir qualquer número de argumentos, mas a função depende de você para informar o número e os tipos desses argumentos. No caso de printf
, isso significa uma string com informações de tipo codificado, como %d
significado int
. Se você mentir sobre o tipo ou número, a função não possui um meio padrão de saber, embora alguns compiladores tenham a capacidade de verificar e emitir avisos quando você mente.