Ci sono molti modi per leggere il testo da stdin in uno std::string
. La cosa su std::string
s è che crescono come necessario, che a sua volta significa che si riallocano. Internamente un std::string
ha un puntatore a un buffer a lunghezza fissa. Quando il buffer è pieno e si richiede di aggiungere uno o più caratteri, l'oggetto std::string
creerà un nuovo buffer più grande invece di quello vecchio e sposterà tutto il testo nel nuovo buffer.
Tutto questo per dire che se si conosce la lunghezza del testo che si sta per leggere in precedenza, è possibile migliorare le prestazioni evitando queste riallocazioni.
#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));
Tutto quanto sopra sarà copiare tutto il testo trovato in stdin, end-of-file fino. Se si desidera solo una singola linea, utilizzare std::getline()
:
#include <string>
#include <iostream>
// ...
string in;
while(getline(cin, in)) {
// ...
}
Se si desidera un singolo carattere, utilizzare std::istream::get()
:
#include <iostream>
// ...
char ch;
while(cin.get(ch)) {
// ...
}
L'utilizzo del printf non è sicuro, dovrebbe essere 'printf ("% s ", s.c_str());' per evitare overflow del buffer. – LiraNuna
Hai ragione, lo correggerò. –