Смешивание различных методов ввода на istream
(get
, getline
, operator>>
) может быть сопряжено с опасностью, если вы не знаете, какие методы оставляют символ разделителя в потоке, а какие нет.t и обрабатывать их соответственно.
В этом случае get
будет читать 300 символов ввода или ввода вплоть до новой строки, в зависимости от того, что произойдет раньше.Новая строка не будет извлечена и останется в потоке.Это означает, что ваш вызов scanf()
будет читать новую строку и останавливаться, оставляя y
или n
, который вы только что набрали в потоке.
Есть несколько способов реорганизовать этот код, чтобы онкажется, что вы хотите.Это один из способов:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string cevap;
char tekrar='y';
while (tekrar!='n')
{
getline(cin,cevap);
cout<<cevap<<endl;
cout<<"Again? (y/n)";
tekrar = cin.get();
cin.ignore();
}
return 0;
}
При этом используется std::string
и нечлен getline
для чтения ввода таким образом, чтобы не требовать ограничения в 300 символов (строго говоря, не связанныхна вопрос, но, как правило, хорошая практика).getline
потребляет и отбрасывает разделитель, но get
, используемый для чтения ввода продолжения, не делает, поэтому мы отбрасываем его вручную через ignore
.