Czyszczenie bufora, a Linux

0

Uczę się dopiero, więc wybaczcie banalność kodu, ale nie mogę sobie z czymś poradzić - program, który działa bez problemu pod Windowsem, działa pod Linuksem, jednak nie tak, jak należy - pętla nieskończona i koniec. Tzn. jeśli podaję poprawne dane to wszystko jest okej, natomiast po wczytaniu tekstu mam przed oczami całą konsolę pełną "Podaj...".

 
#include<iostream>
using namespace std;

double potega(double x, int n)
{
    if (n == 0)
    {
        return 1;
    }
    if (n % 2 != 0)
    {
        return x*potega(x, n-1);
    }
    else
    {
        double a = potega(x, n/2);
        return a*a;
    }
}

int main()
{
    int podstawa;
    int wykladnik;
    do
    {
        cout << "Podaj podstawe potegi ";
        cin.clear();
        cin.sync();
        cin >> podstawa;
    }
    while(cin.fail());

    do
    {
        do
        {
            cout << "Podaj wykladnik potegi (naturalny) ";
            cin.clear();
            cin.sync();
            cin >> wykladnik;
        }
        while(cin.fail());
    }
    while(wykladnik <= 0);
    cout << "Wynik potegowania to " << potega(podstawa, wykladnik);
    return 0;
}

Co zrobić, żeby pod Linuksem działało to zgodnie z zamierzeniem?

0

Zamiast cin.sync() użyj cin.ignore() http://en.cppreference.com/w/cpp/io/basic_istream/ignore

Jeżeli chodzi o drugie pytanie to wypisz sobie przed obliczaniem wartość wykładnika. Dla takiego -1 będzie olbrzymia, więc rekurencyjnych wywołań będziesz miał ogrom i w końcu przepełnisz stos.

0

Bardzo dziękuję za pomoc, poniżej przepisany kod main(). Jeśli chodzi o pytanie dodatkowe to edytowałem temat z uwagi na to, że zdążyłem ogarnąć mój błąd.

int main()
{
    double podstawa;
    int wykladnik;
    do
    {
        cout << "Podaj podstawe potegi ";
        if(cin.fail())
        {
            cin.clear();
            cin.ignore();
        }
        cin >> podstawa;
    }
    while(cin.fail());

    do
    {
        do
        {
            cout << "Podaj wykladnik potegi (naturalny) ";
            if(cin.fail())
            {
                cin.clear();
                cin.ignore();
            }
            cin >> wykladnik;
        }
        while(cin.fail());
    }
    while(wykladnik <= 0);
    cout << "Wynik potegowania to " << potega(podstawa, wykladnik);
    return 0;
}
0

Te dwa warianty, wg mnie nieco bardziej czytelniejsze:

   while(true)
     {
      cout<<"Podaj podstawe potegi ";
      if(cin>>podstawa) break;
      cin.clear();
      cin.ignore(INT_MAX,'\n');
     }
   while(!(cout<<"Podaj podstawe potegi ", cin>>podstawa))
     {
      cin.clear();
      cin.ignore(INT_MAX,'\n');
     }

1 użytkowników online, w tym zalogowanych: 0, gości: 1