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)) {
// ...
}
Ihre Nutzung von printf ist unsicher, sollte es 'printf ("% s werden ", s.c_str());' um Pufferüberläufe zu verhindern. " – LiraNuna
Sie haben Recht, ich werde es korrigieren. –