2011-10-14 3 views
6

Sono un newb completo a C++, ma non a Java, C#, JavaScript, VB. Sto lavorando con un'app di console C++ predefinita da Visual Studio 2010.C++ e printf - output di caratteri strani

Nel tentativo di eseguire una stampa ho alcuni caratteri strani. Non è la stessa ogni volta che mi dice che potrebbero essere alla ricerca di una diversa posizione di memoria ogni volta che lo eseguo.

Codice:

#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

Utilizzare 'cout' in C++. Per printf con% s avresti bisogno di 'p.first_name.c_str()' ma non usare 'printf' in C++. –

risposta

8

Il problema è che printf/scanf non sono typesafe. Stai fornendo un oggetto std::string dove printf si aspetta un const char*.

Un modo per risolvere questo problema è quello di scrivere

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

Tuttavia, dal momento che stai codifica in C++, è una buona idea di utilizzare I/O flussi di preferenza a printf/scanf:

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

Grazie +1. Quindi esiste una formattazione equivalente a printf in C++? – BuddyJoe

2

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

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

Tuttavia, perché non stai usando iostream, se stai usando C++?

+0

+1 perché sono un tale newb. Rompere i miei libri C++ di nuovo mentre parliamo. – BuddyJoe

+0

Perché iostream è molto, molto molto, molto dannatamente lento rispetto a printf(). Un sacco di cose che non ti servono. Google! – Notinlist

2

Non è possibile passare oggetti C++ std::string in printf. printf comprende solo i tipi primitivi come int, float e char*. Il tuo compilatore dovrebbe inviarti un avviso; se non lo è, aumenta il livello di avviso.

Dato che si utilizza C++, si dovrebbe usare lo std::cout per l'output di testo e questo capisce gli oggetti std::string. Se davvero devi utilizzare printf per qualche motivo, quindi converti il ​​std::string in un const char* chiamando il metodo c_str() su di esso.

4

Converti la stringa in una stringa c.

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

Inoltre, dal momento che si sta utilizzando C++, si dovrebbe conoscere cout invece di printf!

+0

+1 per rispondere alla domanda e poi spingendolo nella giusta direzione. – Lou

0

printf("%s") accetta una stringa in stile c terminata da un '\0'. Tuttavia, l'oggetto string è un oggetto C++ diverso da una stringa in stile c. È necessario utilizzare std::cout che è sovraccarico per gestire direttamente il tipo string, come illustrato di seguito.

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

OK, così hai dimostrato come emettere il nome. Che dire della parola "Ciao"? –

+0

@Jim, per OP "Hello" già fatto bene w/printf. Dovresti provare l'identità nella parte principale della domanda, ignorando le altre parti banali. Destra? –