Функция, которая берет входные данные из вопроса и использует этот вход в основной функции - PullRequest
0 голосов
/ 09 ноября 2019

В настоящее время я пишу программу для симуляции парашютов и лестниц. Для пользователя первым, что появится в окне консоли, будет запрос имени игрока 1 и имени игрока 2. Очевидно, я мог бы просто сделать cout << "name 1?"и cin как переменная. Однако в этом назначении мы получили бы дополнительный кредит, если бы мы сделали функцию, которая использует этот вход, чтобы использовать его в основной функции. Другими словами, как мне написать функцию, чтобы при вызове она возвращала введенные нами данные? Я пытался некоторое время, и до сих пор не могу понять это. Вот psuedocode того, что я пытаюсь </p>

string GetPlayerNames(string player1Name, string player2Name);

int main ()
{
string GetPlayerNames(player1Name, player2Name); // Calling the function
// rest of code for the game
}

string GetPlayerNames(string player1Name, string player2Name)
{
cout << "What is the name of player 1? ";
cin >> player1Name;
return player1Name;
cout << "What is the name of player 2? ";
cin >> player2Name;
return player2Name;
}

Оптимально, это то, как должен выглядеть вывод при запуске программы.

Как называется игрок 1? введите имя

Как зовут игрока 2? введите имя

запускает игру, используя имена двух игроков

Извините за вопрос noob, я очень новый программист! Ценю любую помощь, которую я могу получить здесь.

Ответы [ 3 ]

1 голос
/ 09 ноября 2019

Функция может возвращать только одно значение. Вы можете вернуть std::pair<std::string, std::string>

#include <iostream>
#include <string>
#include <utility>
using std::cin;
using std::cout;
using std::pair;
using std::string;

pair<string, string> GetPlayerNames();

int main ()
{
    auto [player1Name, player2Name] = GetPlayerNames(); // Calling the function
// rest of code for the game
}

pair<string, string> GetPlayerNames()
{
    string player1Name, player2Name;
    cout << "What is the name of player 1? ";
    cin >> player1Name;
    cout << "What is the name of player 2? ";
    cin >> player2Name;
    return std::make_pair(player1Name, player2Name);
}

Вместо того, чтобы возвращать имена, вы можете использовать ссылки

#include <iostream>
#include <string>
#include <utility>
using std::cin;
using std::cout;
using std::pair;
using std::string;

void GetPlayerNames(string &player1Name, string &player2Name);

int main ()
{
    string player1Name, player2Name;
    GetPlayerNames(player1Name, player2Name); // Calling the function
// rest of code for the game
}

void GetPlayerNames(string &player1Name, string &player2Name)
{
    cout << "What is the name of player 1? ";
    cin >> player1Name;
    cout << "What is the name of player 2? ";
    cin >> player2Name;
}
0 голосов
/ 09 ноября 2019

Несмотря на то, что вы можете создать функцию, которая будет читать для вас строку, вы должны предоставить способ указать, удалось ли функции или не удалось на самом деле прочитать и сохранить строку,В противном случае при любой поточной ошибке или если пользователь сгенерирует руководство 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)

Существует множество способов объединения частей, но всегда не забывайте проверять, подтверждать,проверить каждый пользовательский ввод. Дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 09 ноября 2019

Передайте их по ссылке. Бум, вам не нужно ничего возвращать.

void get_name(string & , string &);
int main()
{
    string player1 , player2;
    cout<<player1<<player2<<endl;
    get_name(player1, player2);
    cout<<player1<<player2<<endl;
    return 0;
}
void get_name(string &player1, string & player2)
{
    cout<<"Enter names\n";
    cin>>player1>>player2;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...