2015-08-25 3 views
-2

Извинения для (предыдущего?) Плохо сформулированного вопросаC++ Предотвращение CMD команда используется

Я пытаюсь предотвратить CMD команды используются. В частности, F6 - единственная кнопка, с которой я не могу работать. Ввод F6 закрывает программу или выполняет функцию userName().

Из-за того, что F6 или Ctr + Z являются прямой командой для ввода цикла. Это заставило мою программу действовать непредсказуемо. На одной машине он бесконечно петляет, сам по себе он закрывает окно

Часть моей оценки, которая меня заводила с тех пор, как я начал ее. У многих моих сверстников также есть проблемы с этим, но это был прямой запрос о том, что это немедленный «провал», если он может разрушить нашу программу. Вот почему я хочу быть стойкими на позволяя лишь символы, определяемые ниже:

size_t found = user.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"); 

В соответствии с просьбой также достаточно программы для репликации проблемы:

#include <iostream> 
#include <sstream> 
#include <vector> 
#include <cmath> 
#include <ctime> 
#include <cstdlib> 
#include <string> 
#include <istream> 
#include <cstddef> 
string name = { "" }; 
int menu(); 
int errorChecking(string user); 
int userName(); 

    int main() 
{ 
    cout << "-------------------- Welcome! --------------------" << endl << endl; 

    userName(); 

} 

int errorChecking(string user) 
{ 
    size_t found = user.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"); 
    if (found != string::npos) 
    { 
     cout << name[found] << " is not an acceptable character." << '\n'; 
     cout << "Enter a valid name "; 
     cout << endl << endl; 
     userName(); 
    } 

    return(0); 

} 

int userName() 
{ 

    cout << "Enter your name: "; 
    std::getline(cin, name); 
    //if (name == "→") { cin.clear(); userName(); } 
    errorChecking(name); 

    return(0); 
} 
+5

'cin >>' не «бесконечно петля» - нет оператора цикла. Как выглядит остальная часть вашего кода - часть, содержащая цикл? –

+0

Вы помните, чтобы [очистить] (http://en.cppreference.com/w/cpp/io/basic_ios/clear) статус потока? –

+1

С cin, cout и string вы уже используете стандартные библиотеки. Сложно писать что-либо без стандартных библиотек, если вы сначала не перепишете кусок стандартных библиотек. – user4581301

ответ

0

Проблема заключается в том, что CtrlZ нажатие клавиши в командной строке Windows указывает «конец файла». Когда cin встречает конец файла, поток переходит в состояние ошибки, и никакие дальнейшие вызовы на std::getline(cin, name) на самом деле ждут ввода пользователем любого ввода.

Что вам нужно сделать, это правильно обработать состояние ошибки потока. Один из способов сделать это может быть:

cout << "Enter your name: "; 
std::getline(cin, name); 
if (!cin) { 
    cerr << "Unexpected end of file encountered on cin\n"; 
    exit(1); 
} 
errorChecking(name); 

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

+0

Спасибо тонне, это именно то, что я искал. Я не понимал, что можно было сказать! Cin или if («На самом деле мы не получили никакого ввода») –

+0

И просто нужно было добавить cin.clear(); перед вызовом userName(); функция. –

Смежные вопросы