Итак, я начинающий программист... и я не могу понять, в чем проблема в этом фрагменте кода, который я пишу для текстового приключения. Все, что я хочу сделать. В данный момент пользователь вводит команду, а затем преобразует ее в ALLCAPS и печатает ее. Он должен выводить это:
What shall I do?
pie
Your raw command was: PIE
Но вместо этого он выводит это:
What shall I do?
pie
PIE
... и затем замораживается. Здесь код:
#include <iostream>
#include <string>
#include <cctype>
#include <cstring>
#include <vector>
using namespace std;
void command_case();
string userIn;
string raw_command;
int x = 0;
int main()
{
while(raw_command != "QUIT")
{
cout << "What shall I do?\n";
cin >> userIn;
command_case();
cout << "Your raw command was: " << raw_command << endl;
}
return 0;
}
void command_case()
{
char command[userIn.size()+1];
strcpy(command, userIn.c_str());
while(x < userIn.size()+1)
{
if(islower(command[x]))
{
command[x] = toupper(command[x]);
cout << command[x];
x++;
}
else if(isupper(command[x]))
{
cout << command[x];
x++;
}
}
raw_command = command;
}
Я думаю, что это может быть проблемой с циклом while в void command_case()
, но я не могу точно определить, что это за проблема. Я был бы признателен за любые советы, которые вы можете мне дать.
Вы можете легко сделать что-то вроде
void command_case()
{
for(int i =0; i<userIn.size(); i++)
{
userIn[i] = toupper(userIn[i]);
}
}
затем cout<<userIn
в главном
Проблема заключается в переменной x в функции command_case().
Когда x становится 3 (и "команда [x] указывает на нулевой символ в конце" pie "), ни llower (команда [x]), либо isupper (команда [x]) не верны.
Ни одна из частей оператора if не выполняется, поэтому x остается на 3 навсегда. Поскольку "userIn.size() +1" равно 4, а x никогда не достигает 4, цикл никогда не выходит.
Возможное решение - удалить "x++" из обоих разделов оператора if и иметь один "x++" после оператора if. Это будет увеличивать x в каждом цикле независимо от того, на что указывает символ "команда [x]".
Слишком много:
while(x < userIn.size()+1)
Вы должны удалить все вызовы cout из функции command_case(). Фактически вся if-ветвь в функции бесполезна, и вы можете просто заменить ее следующим:
command[x]=toupper(command[x]);
Для простоты вы можете заменить всю команду command_case() функцией (просто запомните #include <algorithm>
):
std::transform(userIn.begin(), userIn.end(), userIn.begin(), toupper);
char command[userIn.size()+1];
- массивы переменной длины недопустимы в C ++. Весь этот бизнесstrcpy()
имеет смысла, так как вы можете просто использоватьuserIn[x]
и тому подобное.std::string
илиchar *
; не пересекать потоки, если вы не знаете, что делаете. (Цитата из фильма GhostBusters).