Может кто-нибудь объяснить ошибку в этом цикле while?

0

Итак, я начинающий программист... и я не могу понять, в чем проблема в этом фрагменте кода, который я пишу для текстового приключения. Все, что я хочу сделать. В данный момент пользователь вводит команду, а затем преобразует ее в 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(), но я не могу точно определить, что это за проблема. Я был бы признателен за любые советы, которые вы можете мне дать.

  • 1
    char command[userIn.size()+1]; - массивы переменной длины недопустимы в C ++. Весь этот бизнес strcpy() имеет смысла, так как вы можете просто использовать userIn[x] и тому подобное.
  • 1
    Поищите в Интернете "c ++ string transform toupper". Либо используйте std::string или char * ; не пересекать потоки, если вы не знаете, что делаете. (Цитата из фильма GhostBusters).
Показать ещё 1 комментарий
Теги:
while-loop

4 ответа

0
Лучший ответ

Вы можете легко сделать что-то вроде

void command_case()
{
    for(int i =0; i<userIn.size(); i++)
    {
      userIn[i] = toupper(userIn[i]);
    }
}

затем cout<<userIn в главном

1

Проблема заключается в переменной 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]".

1

Слишком много:

while(x < userIn.size()+1)
  • 0
    Не используйте время, потому что это безопаснее. Если вы используете while, убедитесь, что каждое выполнение тела уменьшает количество оставшихся итераций. Строка имеет элементы от 0 до длины-1.
0

Вы должны удалить все вызовы cout из функции command_case(). Фактически вся if-ветвь в функции бесполезна, и вы можете просто заменить ее следующим:

command[x]=toupper(command[x]);

Для простоты вы можете заменить всю команду command_case() функцией (просто запомните #include <algorithm>):

std::transform(userIn.begin(), userIn.end(), userIn.begin(), toupper);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню