2010-09-03 13 views

Odpowiedz

25

Ponieważ %s wskazuje char*, a nie std::string. Użyj s.c_str() albo jeszcze lepiej wykorzystać, iostreams:

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string s("bla"); 
    std::cout << s << "\n"; 
} 
+0

Próbowałem go z std :: cout i kompilator wydaje błąd: binarny "<<": nie znaleziono operatora, który pobiera prawy operand typu "std :: string" – user429400

+0

To bardzo dziwne. Która implementacja C++ jest taka? – pjc50

+0

Zmieniłem kod, aby był samodzielny i można go kompilować (i przetestować). –

18

Musisz użyć c_str, aby uzyskać ciąg znaków równoważny zawartości ciągu, ponieważ printf nie wie, jak wydrukować obiekt ciągu.

string s("bla"); 
printf("%s \n", s.c_str()); 

Zamiast tego można po prostu zrobić:

string s("bla"); 
std::cout<<s; 
+1

Dziękuję ... btw - dlaczego? printf nie wie, jak obsługiwać ciągi znaków? Czy istnieje inna metoda, której mogę użyć? – user429400

+0

Próbowałem już z std :: cout i kompilator wypisuje błąd: binarny "<<": nie znaleziono operatora, który bierze prawy operand typu 'std :: string' – user429400

+0

printf nie wie jak obsługiwać C++ std :: string s, działa na łańcuchach c (tablica znaków z \ 0 do zaznaczenia końca łańcucha), zauważ, że z powodu wstecznej zgodności C++ C++ ciąg literałów, tj. po prostu "bla" zamiast ciągu s ("bla" ") są łańcuchami c, a nie obiektami klasy C++ std :: string. –

1

udało mi się wydrukować łańcuch za pomocą "cout", kiedy przełącza się z:

#include <string.h> 

do

#include <string> 

życzę Rozumiem, dlaczego to ma znaczenie ...

+1

Myślę, że ten komentarz został zmanipulowany? – pjc50

+0

Od 'include' do' include'? Co masz na myśli ? –

+0

SO przetrząsał swój komentarz, naprawiłem go, dodająC#. – egrunin