Istnieje wiele sposobów czytania tekstu ze standardowego wejścia na standard std::string
. Chodzi o to, że rozwijają się w miarę potrzeb, co z kolei oznacza ich ponowne przydzielenie. Wewnętrznie std::string
ma wskaźnik do bufora o stałej długości. Kiedy bufor jest pełny i żądasz dodania do niego jednego lub więcej znaków, obiekt std::string
utworzy nowy, większy bufor zamiast starego i przeniesie cały tekst do nowego bufora.
Wszystko to, aby powiedzieć, że jeśli znasz długość tekstu, który zamierzasz przeczytać wcześniej, możesz poprawić wydajność, unikając tych ponownych przydziałów.
#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));
Wszystkie powyższe skopiuje wszystkie teksty znalezione w stdin, aż do końca pliku. Jeśli chcesz tylko jednej linii, użyj std::getline()
:
#include <string>
#include <iostream>
// ...
string in;
while(getline(cin, in)) {
// ...
}
jeśli chcesz pojedynczy znak, użyj std::istream::get()
:
#include <iostream>
// ...
char ch;
while(cin.get(ch)) {
// ...
}
Korzystanie z printf jest niebezpieczny, należy 'printf ("% s ", s.c_str());' aby zapobiec przepełnieniu bufora. – LiraNuna
Masz rację, poprawię to. –