2010-04-25 4 views
0

Как говорится в этом вопросе, по какой-то причине моя программа не смывает ввод или использует мои переменные способами, которые я не могу определить в данный момент. Это для домашних заданий проекта, что я вышел за рамки того, что я должен был сделать для него, теперь я просто хочу, чтобы программа действительно работает: PВвод не очищается

Детали, чтобы сделать нахождение проще:

Программа выполняет безупречно при первом прохождении. Все броски работают, принимаются только правильные значения (n> 0) и превращаются в двоичные.

Как только я ввожу свой прекратить ввод, программа переходит в петлю и только просит для вновь прекратить так:

Когда я запускаю эту программу на Netbeans на моем Linux Laptop, программа вылетает после ввода значения завершения. На Visual C++ в Windows он переходит в цикл, как описано.

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

Я считаю, что ошибка лежит либо в главной функции:

int main(void) 
{ 
vector<int> store; 
int terminate = 1; 

do 
{ 
    int num = 0; 
    string input = ""; 

    if(cin.fail()) 
    { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    } 

    cout << "Please enter a natural number." << endl; 
    readLine(input, num); 

    cout << "\nThank you. Number is being processed..." << endl; 
    workNum(num, store); 

    line; 
    cout << "Go again? 0 to terminate." << endl; 
    cin >> terminate // No checking yet, just want it to work! 

    cin.clear(); 
}while(terminate); 

cin.get(); 
return 0; 
} 

или в функции, которая считывает номер:

void readLine(string &input, int &num) 
{ 
    int buf = 1; 
    stringstream ss; 
    vec_sz size; 

    if(ss.fail()) 
{ 
     ss.clear(); 
    ss.ignore(numeric_limits<streamsize>::max(), '\n'); 
} 

    if(getline(cin, input)) 
    { 
     size = input.size(); 
     for(int loop = 0; loop < size; ++loop) 
      if(isalpha(input[loop])) 
       throw domain_error("Invalid Input."); 

    ss << input; 
    ss >> buf; 

    if(buf <= 0) 
     throw domain_error("Invalid Input."); 

    num = buf; 

    ss.clear(); 
    } 
} 

ответ

2

При вызове cin >> terminate, он будет считывать значение завершите работу, но оставите после нее строку новой строки во входном потоке. Поздно, когда вы вызываете getline(cin, input), он будет читать до новой строки, что означает, что он получит пустую строку.

Вы можете отбросить все символы вплоть до символа новой строки, добавив это после cin >> terminate:

cin.ignore(99, '\n'); 

Или избежать смешивания operator >> и getline.

+0

Aaaah, я подумал, что если (cin.fail()) будет очистить поток, но да, это логическая ошибка ^^ Спасибо! – IAE

2

Не смешивайте эти >> и getline операторы, такие как interjay. Кроме того, если вы хотите, чтобы очистить свой код, я предполагаю, что это может быть переписана folllowing путь:

int main() { 
    while (true) { 
     std::cout << "Please enter a natural number" << std::endl; 
     int num; 
     std::cin >> num; 

     // Exception handling here can be done easily 
     // like this 
     // if (!(std::cin >> num) || num < 0) 
     // throw std::domain_error("TROLOLOLO"); 

     std::cout << "Thank you. Number is being processed..." << std::endl; 
     //workNum(num, store) here 

     std::cout << "Go again? 0 to terminate." << std::endl; 

     int terminate; 
     std::cin >> terminate; 
     if (terminate == 0) break; 
    } 
} 
Смежные вопросы