【问题标题】:Can't exit an infinite loop无法退出无限循环
【发布时间】:2020-06-06 05:25:33
【问题描述】:

我的程序通过输入任何键启动,然后用户会看到一个颜色变化的文本“欢迎来到我的 程序”。现在,用户应该按任意键继续,但他不能退出正在改变文本颜色的无限循环。让我给你看代码以便更好地理解。

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");
    }
}

【问题讨论】:

  • 标题有点重言式。如果你能退出,它就不会是无限的。
  • 我真的不明白你在做什么。颜色应该不断变化,直到用户按下任何键?
  • 你想跳出无限循环的触发器是什么?如果添加该代码,它是否会跳出无限循环?
  • 使用您的Your rubber duck 浏览代码。重点讨论stopwhile(stop) 的正文中被修改了多少次。
  • stop 的值在循环之前设置(通过调用getchar()。它在循环中永远不会被修改。循环本身永远不会从用户那里读取数据。

标签: c++ text colors infinite-loop


【解决方案1】:

这将是您的解决方案(包括 cmets)

#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" );
        }
    }
}

【讨论】:

  • 谢谢,效果很好。我有 1 个问题。代码必须在主函数中?我尝试使用单独的函数并在主函数中调用它,它打印“终止调用而没有活动异常”。
  • @lucacel 我建议用您尝试过的显示该错误的代码提出一个新问题。将它移到 main 之外应该没有任何问题。
【解决方案2】:

当您使用getchar() 获取用户输入时,它将在整数stop 中存储用户输入的缓冲区的十进制值。

例如:如果用户输入'0'stop 变量将存储值 48(char '0' 的十进制值)。

而你的while循环会在stop不等于0时继续运行,这绝不是因为所有字符的十进制值都不为0,其十进制值为0的唯一字符是NULL

要解决您的问题,您需要根据需要添加退出选项。

【讨论】:

    【解决方案3】:

    如果按如下方式创建循环:

    int myInt = 1;
    
    while (myInt)
    {
        std::cin >> myInt;
    }
    

    循环将一直持续到用户输入 0。这是因为条件语句使用 0 作为“假”,在这种情况下,任何其他值都作为“真”。

    您的实现的问题是您只能让用户输入一次,即使用户输入“0”(字符格式),关联的整数值也是 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;
    }
    

    现在循环将在用户按下任意键时开始,然后内部循环将运行,然后用户需要再次输入一个键。如果用户这次输入“0”,while() 循环将中断,程序将继续运行。

    如果您试图保持循环运行同时搜索用户输入以打破循环,那么您正在尝试一项更复杂的任务。如果您对此感兴趣,请查看 std::thread 库。

    【讨论】:

    • 是的,我希望在搜索用户输入时运行无限循环。我肯定会调查你提到的图书馆。
    • 我尝试添加 std::cin&gt;&gt;stop ,颜色一直在变化,直到它停止的某个点。我想保持循环运行(颜色正在改变),如果用户预先看到任何键,打破它。
    【解决方案4】:

    据我所知,您的代码存在的问题是您只在代码中初始化变量“stop”一次,而从未在循环中初始化。因此,程序只会要求用户输入一次。一个简单的解决方法是在 for 循环结束时不断询问用户输入:std::cin&gt;&gt;stop;。此外,就像其他人已经说过的那样,如果用户输入“0”,它将使用 ASCII 将 char 变量隐式类型转换为整数变量。由于 '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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 2017-01-20
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多