Несмотря на то, что вы можете создать функцию, которая будет читать для вас строку, вы должны предоставить способ указать, удалось ли функции или не удалось на самом деле прочитать и сохранить строку,В противном случае при любой поточной ошибке или если пользователь сгенерирует руководство EOF
с Ctrl + d (или Ctrl + z на окнах), если вам не удастся его отловить, это может быть плохобудет происходить.
Это не характерно для этой функции чтения строки, это верно для каждой функции, которая выполняет некоторую задачу, от которой зависит оставшийся код. «Утвердить, подтвердить, подтвердить» - это правило. Простое целое число, возвращающее 1
в случае успеха или 0
в случае неудачи - это нормально (или наоборот, по вашему выбору). bool
также является простым типом для указания успеха / неудачи.
В вашем случае вас волнует, было ли чтение успешным (зависит от std::ios_base::iostate
после чтения). Прелесть в том, что вам не нужно проверять мелочи .eof(), .fail()
или .bad()
(хотя вы можете это сделать), вы просто проверяете возврат своей функции ввода (использование getline
может быть предпочтительнее >>
для обработки пробелов, а также любых посторонних символов). Здесь вы можете просто сделать что-то вроде:
#include <iostream>
bool getstring (std::string& str, const std::string prompt)
{
std::cout << prompt; /* output prompt */
/* fill str, return true/false for success/failure */
return getline (std::cin, str) ? true : false;
}
, который позволяет вам передать подсказку для отображения пользователю, а затем возвращает true/false
в зависимости от того, успешен ли вызов getline
.
В main()
вы можете просто проверить, была ли ваша функция getstring
успешной или нет, прежде чем полагаться на информацию в вашей строке s
, например,
int main (void) {
std::string s,
prompt {"enter "};
for (int i = 0; i < 2; i++) {
if (getstring(s, prompt + "player " + (char)('1' + i) + ": "))
std::cout << s << "\n\n";
else {
std::cout << "(stream error or user canceled input)\n";
return 1;
}
}
}
(которая также позволяет вам использовать значение по умолчанию)возможность объединения std::string
в формировании приглашения - при условии, что у вас не более девяти игроков, использующих описанный выше метод)
Это будет обрабатывать ввод вашего игрока, включая пробелы в имени, и при обработкесгенерированный вручную EOF
на любом из входов. Короткий пример с двумя игроками:
Пример использования / Вывод
$ ./bin/chutes
enter player 1: Mickey Mouse
Mickey Mouse
enter player 2: Goofy Dog
Goofy Dog
Или если пользователь генерирует руководство EOF
с помощью Ctrl +d (или Ctrl + z в окнах):
$ ./bin/chutes
enter player 1: (stream error or user canceled input)
Существует множество способов объединения частей, но всегда не забывайте проверять, подтверждать,проверить каждый пользовательский ввод. Дайте мне знать, если у вас есть дополнительные вопросы.