cin.get в цикле while - PullRequest
       23

cin.get в цикле while

1 голос
/ 08 февраля 2011

Я пытаюсь получить ввод от пользователя и выдавать вывод, пока он / она не нажмет 'n'.Это не похоже на работу.Проблема в scanf или cin.get?Когда я нажимаю y, он просто принимает «tekrar» в качестве входных данных, таким образом, дает «y» в качестве выходных данных и входит в цикл.Кроме того, не останавливается, когда я даю n в качестве входных данных tekrar.

char cevap[300]="";
char tekrar='y';
while (tekrar!='n')
{
  cin.get(cevap,300);
  cout<<cevap<<endl;
  cout<<"Again? (y/n)";
  scanf("%c",&tekrar);
}

output:

Hello
Again? (y/n)
y 
Again? (y/n)
y 
Again? (y/n)
n
Again? (y/n)
n 
...  

Ответы [ 2 ]

5 голосов
/ 08 февраля 2011

Смешивание различных методов ввода на 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.

3 голосов
/ 08 февраля 2011

Используйте оператор cin >> для чтения из стандартного ввода вместо scanf:

string cevap;
char tekrar='y';
while (tekrar!='n')
{
  getline(cin, cevap);
  cout<<cevap<<endl;
  cout<<"Again? (y/n)";
  cin >> tekrar;
  cin.get();
}

Редактировать: исправлен бесконечный цикл. Вы должны использовать std :: string вместо простого массива char.

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