Как остановить рекурсию, если в cin ничего не указано? - PullRequest
1 голос
/ 14 июня 2011

Я пишу программу, которая должна сначала печатать числа, которые были введены в конце.

Так вот мой код:

#include <iostream>
using namespace std;
void recursive()
{
    long long n;

     if((cin>>n)&&(!cin.eof())) // Dont work because enter is ignored in cmd window os 
          recursive();

    cout<<n<<endl;
    return;
}
int main()
{
    recursive();
    return 0;
}

Любая идея, как остановить работу, когда ничего не происходитвход?Или как решить проблему по-другому?

Спасибо

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Поскольку ваша программа прямо сейчас, она будет читать длинные long, пока оператор cin void * не покажет, что прочитанное значение не было совместимым (но все равно печатает n, заполненное мусором, которое не удалось прочитать), как вы заметилиигнорирует пустые строки.

Если я правильно понимаю, вы хотите, чтобы, когда пользователь вводит пустую строку, программа выводила прочитанные числа, простой способ сделать это - прочитать ввод в виде строки, а затем проверитьдлина строки и используйте поток строки для преобразования его в соответствующий тип.

#include <iostream>
#include <sstream>
#include <string>
void recursive()
{
    std::string       input;
    long long         n;

    if ( std::getline(std::cin,input) && input.length() > 0 )
    {
        std::istringstream ss(input);
        if (ss >> n)
        {
            recursive();
            std::cout << n << std::endl;        
        }
    }
}


int main ()
{
    recursive();
    return 0;
}

edit

Вот другой способ, если ваш ввод поступает в виде 46 798 4163 4654 32132, он использует std :: cin.peek (), который возвращает следующий символ во входных данных, не извлекая его, результат peek () сравнивается с '\ n', чтобы проверить, нажал ли пользователь ввод, и если это такон печатает только что прочитанный номер, не дожидаясь следующего номера

#include <iostream>
#include <sstream>
#include <string>

void recursive_in_a_line ()
{
    long long n;
    if (std::cin >> n)
    {
        if (std::cin.peek() != '\n')
        {
            recursive();
        }
        std::cout<< n << std::endl;
    }

}        


int main ()
{
    recursive_in_a_line();
    return 0;
}
1 голос
/ 14 июня 2011

Нужно ли реализовывать программу рекурсивным способом? Альтернативное решение, которое не использует рекурсию, состояло бы в том, чтобы прочитать числа в цикле while и добавить их в контейнер (список или вектор), а затем отобразить содержимое контейнера.

...