2011-02-04 3 views
0

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

#include <iostream> 
#include <string> 
using namespace std; 


int main() 
{ 
    int i; 
    char str[100]; 
    while (!(cin >> i)) 
    { 
     gets(str); 
     cout << "failure read!" << endl; 
    } 

    cout << "successful read!" << endl; 
    return 0; 
} 
+1

то, что вы пытаетесь сделать? –

+0

Что не так? Пожалуйста, будьте конкретны. – birryree

+0

Пожалуйста, подтвердите свой вопрос в форме вопроса. – tylerl

ответ

4

Очистить состояние ошибки:

int main() 
{ 
    int i; 
    char str[100]; 
    while (!(cin >> i)) 
    { 
     cin.clear(); 
     cin.getline(str,100); 
     cout << "failure read!" << endl; 
    } 

    cout << "successful read!" << endl; 
    return 0; 
} 
+0

Отклонитесь. Ты прав. Мне нужно сделать cin.ckear(). – NoviceCai

1

Я думаю, что вы хотите заменить время цикла с, если заявлением, с этим циклом, вы будете постоянно читать CIN во время возникновения ошибки. Однако cin структурирован так, что после возникновения ошибки вы должны вручную очистить состояние ошибки, и поскольку вы не делаете этого, это приведет к бесконечному циклу. Использование оператора if пытается прочитать значение, а затем давайте узнаем, удалось ли ему это сделать.

Кроме того, это действительно нехороший способ прочитать от cin. Он хрупкий, и любой недействительный ввод может полностью удалить вашу программу, так как получение по своей сути небезопасно. Для обсуждения более безопасного и более надежного способа, чтобы получить вход в C++, проверить http://www.stanford.edu/class/cs106l/course-reader/Ch3_Streams.pdf

+0

этот ответ не то, что я хочу. – NoviceCai

+2

@NoviceCai: Если вы не хотите ответа, который объясняет, что не так и лучше, ** почему вы задали вопрос? ** –

+0

Нет. Я имею в виду, что я хочу получить ответ. Но то, что вы сказали, не то, что я хочу. Извините – NoviceCai