Hay muchas maneras de leer el texto de stdin en un std::string
. Lo que pasa con std::string
s es que crecen según sea necesario, lo que a su vez significa que se reasignan. Internamente, un std::string
tiene un puntero a un buffer de longitud fija. Cuando el búfer está lleno y solicita agregar uno o más caracteres, el objeto std::string
creará un nuevo búfer más grande en lugar del antiguo y moverá todo el texto al nuevo búfer.
Todo esto para decir que si conoce la longitud del texto que va a leer de antemano, entonces puede mejorar el rendimiento al evitar estas reasignaciones.
#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));
Todo lo anterior copiará todo el texto encontrado en stdin, hasta el final del archivo. Si sólo desea una sola línea, utilice std::getline()
:
#include <string>
#include <iostream>
// ...
string in;
while(getline(cin, in)) {
// ...
}
Si quieres un solo carácter, utilice std::istream::get()
:
#include <iostream>
// ...
char ch;
while(cin.get(ch)) {
// ...
}
Su uso de printf es insegura, debe ser 'printf ("% s ", s.c_str());' para evitar desbordamientos de búfer. – LiraNuna
Tienes razón, lo corregiré. –