Есть две вещи, которые прерывают работу вашего кода
std::transform(terminate.begin(), terminate.end(), terminate.begin(),::toupper); //Extra stuff makes it not case sensitive
Прежде всего логическая проблема.Вы выполняете операцию над предопределенной строкой , завершаете , но не изменяете строку ввода пользователя input .Фактически вы можете заменить ваш
std::string terminate = "end";
std::transform(terminate.begin(), terminate.end(), terminate.begin(),::toupper); //Extra stuff makes it not case sensitive
на одну строку
std::string terminate = "END";
И затем вы измените регистр строки перед циклом чтения, чтобы он не мог изменить пользовательский ввод,он определяет только начальное состояние строки.Таким образом, позиция и цель модификации строки должны быть изменены:
int main() {
std::string input;
// Replace two initial rows by one with the same result
std::string terminate = "END";
std::cout << "This program checks for a balanced expression" << std::endl << "Enter 'end' to end the program" << std::endl;
while(input != terminate){
std::cout << "Enter Expression: ";
std::cin >> input;
if(checkBalance(input))
std::cout << input << " " << "is balanced" << std::endl;
else
std::cout << input << " " << "is not balanced" << std::endl;
// Modify user input to upper case for possibility of successful check on next while loop
std::transform(input.begin(), input.end(), input.begin(),::toupper); //Extra stuff makes it not case sensitive
}
return 0;
}
Я обнаружил вход модификацию после checkBalance (вход) , так как я не уверен, какие модификации он может сделать для входа .На самом деле наиболее логичная позиция преобразования регистра input - непосредственно после чтения строки, т.е. после
std::cin >> input;
Еще одна нота.Ваш исходный код должен выйти для END ввода (т. Е. Верхнего регистра).