2011-10-14 16 views
6

Soy un nuevo miembro de C++, pero no de Java, C#, JavaScript, VB. Estoy trabajando con una aplicación de consola C++ predeterminada de Visual Studio 2010.C++ y printf: salida de caracteres extraños

Al tratar de hacer una impresión, obtengo algunos caracteres extraños. No es lo mismo cada vez que me dice que pueden estar buscando diferentes ubicaciones de memoria cada vez que lo ejecuto.

Código:

#include "stdafx.h" 
#include <string> 

using namespace std; 

class Person 
{ 
public: 
    string first_name; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char somechar; 
    Person p; 
    p.first_name = "Bruno"; 

    printf("Hello %s", p.first_name); 
    scanf("%c",&somechar); 
    return 0; 
} 
+3

Utilice 'cout' en C++. Para printf con% s necesitaría 'p.first_name.c_str()' pero no use 'printf' en C++. –

Respuesta

8

El problema es que printf/scanf no son seguros. Está suministrando un objeto std::string donde printf espera un const char*.

Una forma de solucionar este problema es escribir

printf("Hello %s", p.first_name.c_str()); 

Sin embargo, desde el momento de codificar en C++, que es una buena idea usar E/S arroyos con preferencia a printf/scanf:

std::cout << p.first_name << std::endl; 
std::cin >> c; 
+0

Gracias +1. Entonces, ¿hay un formato equivalente a printf en C++? – BuddyJoe

2

Uso printf("Hello %s",p.first_name.c_str());!

2
printf("Hello %s", p.first_name.c_str()); 

Sin embargo, ¿por qué no usa iostream, si utiliza C++?

+0

+1 porque soy tan nuevo. Romper mis libros de C++ nuevamente mientras hablamos. – BuddyJoe

+0

Porque iostream es muy, muy muy, muy, muy lento en comparación con printf(). Hay muchas cosas que no necesitas Google! – Notinlist

2

No puede pasar objetos C++ std::string en printf. printf solo entiende los tipos primitivos como int, float y char*. Su compilador debería darle una advertencia allí; si no es así, suba su nivel de advertencia.

Dado que está utilizando C++, realmente debería usar std::cout para el texto, y eso comprende los objetos std::string. Si realmente tiene que usar printf por algún motivo, convierta el std::string a const char* llamando al método c_str().

4

Convierte la secuencia en una cadena de caracteres.

printf("Hello %s", p.first_name.c_str()); 

Además, como está utilizando C++, ¡debería aprender sobre cout en lugar de printf!

+0

+1 por responder la pregunta y luego empujarlo en la dirección correcta. – Lou

0

printf("%s") acepta una cadena estilo c que termina en '\0'. Sin embargo, el objeto string es un objeto C++ que es diferente de una cadena estilo c. Debería usar std::cout que está sobrecargado para manejar el tipo string directamente, como se muestra a continuación.

std::cout << p.first_name; 
+0

OK, por lo que demostró cómo dar salida al primer nombre. ¿Qué pasa con la palabra "Hola"? –

+0

@Jim, para "Hola" OP ya lo hizo bien con printf. Debes probar la identidad como la parte principal de la pregunta, ignorando las otras partes triviales. ¿Derecha? –

Cuestiones relacionadas