Не могу выйти из бесконечного цикла - PullRequest
1 голос
/ 21 февраля 2020

Моя программа начинается с ввода любой клавиши, затем пользователь видит изменяющий цвет текст «Добро пожаловать в мою программу». Теперь пользователь должен нажать любую клавишу, чтобы продолжить, но он не может выйти из бесконечного l oop, который меняет цвет текста. Позвольте мне показать вам код для лучшего понимания.

HANDLE color=GetStdHandle(STD_OUTPUT_HANDLE);
cout<<"Press any key to start...";
int stop=getchar();
while(stop){
    for(i=10;i<=15;i++){
        cout <<("\n\t\t\t\t\t Welcome to my program\n");
        SetConsoleTextAttribute(color,i);
        Sleep(100);
        system("cls");
    }
}

Ответы [ 4 ]

0 голосов
/ 22 февраля 2020

Это было бы решением для вас (включая комментарии)

#include <iostream>
#include <Windows.h>
#include <thread>

int main()
{
    HANDLE color = GetStdHandle( STD_OUTPUT_HANDLE );
    std::cout << "Press any key to start...";
    bool stop = false; // use a Boolean instead of int 
    // doesn't really matter what the input is, so use getchar().
    // Note, this is really just "enter". You can modify if you expect user to 
    //   hit multiple keys before hitting enter
    getchar(); 

    // This line here will start a new thread which will wait for the user to hit enter
    std::thread getInput = std::thread( [&stop] { getchar(); stop = true; } );
    // Loop stays the same (except I inverse the "stop" variable to make more sense)
    while ( !stop ) {
        for ( int i = 10; i <= 15; i++ ) {
            std::cout << ( "\n\t\t\t\t\t Welcome to my program\n" );
            SetConsoleTextAttribute( color, i );
            Sleep( 100 );
            system( "cls" );
        }
    }
}
0 голосов
/ 21 февраля 2020

Если вы создадите al oop следующим образом:

int myInt = 1;

while (myInt)
{
    std::cin >> myInt;
}

l oop будет продолжаться до тех пор, пока пользователь не введет 0. Это потому, что условные операторы используют 0 в качестве «ложного», и в этом случае любое другое значение как "true".

Проблема с вашей реализацией состоит в том, что вы вводите данные пользователя только один раз, и даже если пользователь вводит "0" (в формате char), соответствующее целочисленное значение равно 48. Вы можете добавить это:

    HANDLE color=GetStdHandle(STD_OUTPUT_HANDLE);
    cout<<"Press any key to start...";
    int stop=getchar();
while(stop){
        for(i=10;i<=15;i++){
        cout <<("\n\t\t\t\t\t Welcome to my program\n");
        SetConsoleTextAttribute(color,i);
        Sleep(100);
        system("cls");
        }
    std::cin >> stop;
}

Теперь l oop запустится, когда пользователь нажмет любую клавишу, затем запустится внутренняя l oop, затем пользователю потребуется снова ввести ключ , Если в этот раз пользователь введет «0», то while () l oop прекратит работу и программа продолжит работу.

Если вы пытаетесь сохранить все oop работающими во время поиска чтобы пользовательский ввод сломал l oop, вы пытаетесь выполнить гораздо более сложную задачу. Посмотрите в библиотеку std :: thread, если вы заинтересованы в этом.

0 голосов
/ 21 февраля 2020

Проблема с вашим кодом из того, что я могу сказать, заключается в том, что вы инициализируете переменную "stop" только один раз в вашем коде, а не внутри вашего l oop. Таким образом, программа будет запрашивать ввод только один раз. Простым решением было бы постоянно запрашивать у пользователя в конце ввода значение l oop: std::cin>>stop;. Кроме того, подобно тому, что уже говорили другие, если пользователь вводит «0», он бы неявно вводил переменную char в целочисленную переменную, используя ASCII. Так как '0' соответствует целочисленному значению 48, в переменной будет сохранено 48 вместо 0. Вы можете исправить это, используя следующий код:

HANDLE color=GetStdHandle(STD_OUTPUT_HANDLE);
cout<<"Press any key to start...";
int stop=getchar()-'0';
while(stop){
    for(i=10;i<=15;i++){
        cout <<("\n\t\t\t\t\t Welcome to my program\n");
        SetConsoleTextAttribute(color,i);
        Sleep(100);
        system("cls");
    }
std::cin>>stop;
}
0 голосов
/ 21 февраля 2020

Когда вы используете getchar() для получения ввода от пользователя, оно будет хранить внутри целого числа stop десятичное значение буфера, введенного пользователем.

Например: если пользователь ввел '0', переменная stop будет хранить значение 48 (десятичное значение символа '0').

И вы, пока l oop продолжите работать, пока stop не равно 0 , что никогда не происходит, потому что десятичное значение всех символов не равно 0, единственный символ, для которого его десятичное значение равно 0, это NULL.

Чтобы решить вашу проблему, вам необходимо добавить параметр выхода в соответствии для ваших нужд.

...