Как принять клавишу [ENTER] как неверный ввод и отправить сообщение об ошибке

Это программа, которая оценивает пользовательский ввод для вопросов экзамена на водительские права.
У меня проблемы с проверкой пользовательского ввода.

Я хотел бы принять клавишу [ENTER] в качестве неверного ввода и перейти к моей проверке, а не просто перейти к пустой строке и не может перейти к следующему вопросу. Цель состоит в том, чтобы отправить сообщение об ошибке и что ввод не введен, и клавиша [ENTER] не является допустимым вводом и допускает только еще один шанс ввести действительный ввод, который является a / A, b / B, c / C или d / D. , Вот почему я использую здесь оператор if вместо цикла.

Я пробовал if (testTakerAnswers [ans] == (или =) ‘\ n’) {}, но все еще не решает проблему перевода строки.

Я включаю curses.h здесь, надеюсь, использовать инструкцию getch () из другого поста, но почему-то мне не удается работать в моем коде с массивом вместо обычного ввода.

Я ищу другие методы, а не getch ()

Поэтому я должен настроить свою функцию bool или напрямую проверить ввод в функции main ().

#include <iostream>
#include <iomanip>
#include <string>
#include <cctype>
#include <curses.h>

using namespace std;

const unsigned SIZE = 20;       // Number of qns in the test
char testTakerAnswers[SIZE];    //Array to hold test taker's answers
bool validateInput(char);

class TestGrader
{
private:
char answers[SIZE];        // Holds the correct answers // Answer is array
int getNumWrong (char[]);
void missedQuestions (char[]);

public:
void setKey(string);   // Initialize object with standard keys
void grade(char[]);     // Grades the answers from tester

};
void TestGrader::setKey(string key){
if (key.length()!=SIZE){
cout << "Error in key data.\n";
return;
}
for (unsigned pos = 0; pos < SIZE ; pos ++)
answers [pos] = key [pos];
}

void TestGrader::grade(char test[])
{
int numWrong = getNumWrong(test);
if (numWrong <= 5)
cout << "Congratulations. You passed the exam.\n";
else
cout << "You did not pass the exam. \n";
cout << "You got " << (SIZE-numWrong) << " questions correct. \n";
if (numWrong > 0){
cout << "You missed the following " << numWrong << " questions: \n";
missedQuestions(test);

}
}

int TestGrader::getNumWrong(char test[])
{
int counter = 0;
for (int i = 0; i < SIZE; i++){
if (answers[i] != toupper(testTakerAnswers[i])){
counter++;
}
}
return counter;
}

void TestGrader::missedQuestions(char test[])
{
//  cout << testTakerAnswers[i];        This is to print taker's answers
int counter = 0;
for (int i = 0; i < SIZE; i++){
if (answers[i] != toupper(testTakerAnswers[i])){
cout << "\n" << i + 1 << ". Correct answers: " << answers[i];
counter++;
}
}
}

bool validateInput(char ans){           // Only A, B, C, D valid input
if (toupper(ans)!='A' && toupper(ans)!= 'B' && toupper(ans)!='C'  && toupper(ans)!= 'D'){
cout << "\n********************WARNING*******************\n";
cout << "Invalid input! Enter only a/A, b/B, c/C, or d/D\n";
return false;
}
if (testTakerAnswers[ans] == '\n'){
return false;
}

return true;
}

int main()
{
const int NUM_QUESTIONS = 20;

string name;                                 //Test taker's name
char doAnother;                 //Control variable for main processing loop
TestGrader DMVexam;                       //Create a TestGrader object

DMVexam.setKey("BDAACABACDBCDADCCBDA");

do {
cout << "Applicant Name: ";
getline(cin,name);
cout << "Enter answer for " << name << ".\n";
cout << "Use only letters a/A, b/B, c/C, and d/D. \n\n";

for (int i = 0; i < NUM_QUESTIONS; i++){
// Input and validate it
do{
cout << "Q" << i+1 << ": ";
cin >> testTakerAnswers[i];

if (!validateInput(testTakerAnswers[i])){

cout << "You get one more chance to correct.\nOtherwise, it count as wrong answer.";
cout << "\n*********************************************";
cout << "\nRe-enter: ";
cin >> testTakerAnswers[i];
cout << '\n';
break;
}
}while(!validateInput(testTakerAnswers[i]));
}

//Call class function to grade the exam
cout << "Results for " << name << '\n';
DMVexam.grade(testTakerAnswers);

cout << "\nGrade another exam (Y/N)? ";
cin >> doAnother;
while (doAnother != 'Y' && doAnother != 'N' && doAnother != 'y' && doAnother != 'n'){
cout << doAnother << " is not a valid option. Try Again y/Y or n/N" << endl;
cin >> doAnother;}
cout << endl;
cin.ignore();

}while(doAnother != 'N' && doAnother != 'n');

return 0;
}

-1

Решение

Ваша проблема cin >> testTakerAnswers[i]; cin — это пробел, разделенный пробелами, это означает, что любые пробелы (включая ‘\ n’) будут отброшены. Поэтому testTakerAnswers [i] никогда не может быть ‘\ n’.

Я не уверен, что именно вы хотите сделать, но, возможно, попробуйте

getline(cin,input_string);

затем

input_string == "A" | input_string == "B" | ...

Так что, если нажата только клавиша ввода, input_string станет "",

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector