2010-04-11 15 views
11
#include<string> 
... 
string in; 

//How do I store a string from stdin to in? 
// 
//gets(in) - 16 cannot convert `std::string' to `char*' for argument `1' to 
//char* gets (char*)' 
// 
//scanf("%s",in) also gives some weird error 

Ähnlich, wie schreibe ich in zu stdout oder zu einer Datei?Wie liest und schreibt man eine STL C++ - Zeichenfolge?

Antwort

21

Sie versuchen, C style I/O mit C++ - Typen zu mischen. Wenn Sie C++ verwenden, sollten Sie die std :: cin und std :: cout Streams für die Eingabe und Ausgabe der Konsole verwenden.

Beim Lesen einer Zeichenfolge hört std :: cin auf zu lesen, sobald ein Leerzeichen oder eine neue Zeile gefunden wird. Sie können getline verwenden, um eine gesamte Eingabezeile von der Konsole abzurufen.

std::getline(std::cin, in); 

Sie verwenden die gleichen Methoden mit einer Datei (wenn es sich um nicht binäre Daten handelt).

std::ofstream ofs('myfile.txt'); 

ofs << myString; 
0

C++ Strings müssen mit >> und << Betreibern und anderen C++ Äquivalente gelesen und geschrieben werden. Wenn Sie jedoch Scanf wie in C verwenden möchten, können Sie immer eine Zeichenfolge, die die C++ Art und Weise lesen und verwenden sscanf mit ihm:

std::string s; 
std::getline(cin, s); 
sscanf(s.c_str(), "%i%i%c", ...); 

Der einfachste Weg zur Ausgabe einer Zeichenkette mit:

s = "string..."; 
cout << s; 
auch

Aber printf funktioniert: [fixed printf]

printf("%s", s.c_str()); 

Verfahren c_str() einen Zeiger auf einen null-ter zurück minierte ASCII-Zeichenfolge, die von allen Standard-C-Funktionen verwendet werden kann.

+2

Ihre Nutzung von printf ist unsicher, sollte es 'printf ("% s werden ", s.c_str());' um Pufferüberläufe zu verhindern. " – LiraNuna

+0

Sie haben Recht, ich werde es korrigieren. –

3

Es gibt viele Möglichkeiten, Text von stdin in std::string zu lesen. Die Sache über std::string s ist jedoch, dass sie wie benötigt wachsen, was wiederum bedeutet, dass sie neu zuweisen. Intern hat ein std::string einen Zeiger auf einen Puffer fester Länge. Wenn der Puffer voll ist und Sie ein oder mehrere Zeichen hinzufügen möchten, erstellt das Objekt std::string einen neuen, größeren Puffer anstelle des alten und verschiebt den gesamten Text in den neuen Puffer.

All dies zu sagen, dass wenn Sie die Länge des Textes wissen, die Sie im Voraus lesen werden, können Sie die Leistung verbessern, indem Sie diese Neuzuweisungen vermeiden.

#include <iostream> 
#include <string> 
#include <streambuf> 
using namespace std; 

// ... 
    // if you don't know the length of string ahead of time: 
    string in(istreambuf_iterator<char>(cin), istreambuf_iterator<char>()); 

    // if you do know the length of string: 
    in.reserve(TEXT_LENGTH); 
    in.assign(istreambuf_iterator<char>(cin), istreambuf_iterator<char>()); 

    // alternatively (include <algorithm> for this): 
    copy(istreambuf_iterator<char>(cin), istreambuf_iterator<char>(), 
     back_inserter(in)); 

Alle oben genannten werden alle Text in Stdin, bis zum Ende der Datei zu kopieren. Wenn Sie nur eine einzige Zeile möchten, verwenden Sie std::getline():

#include <string> 
#include <iostream> 

// ... 
    string in; 
    while(getline(cin, in)) { 
     // ... 
    } 

Wenn Sie ein einzelnes Zeichen möchten, verwenden Sie std::istream::get():

#include <iostream> 

// ... 
    char ch; 
    while(cin.get(ch)) { 
     // ... 
    } 
Verwandte Themen