无休止的 do while 循环C++代码

Endless do while loop in C++ code?

本文关键字:C++ 代码 循环 while do 无休止      更新时间:2023-10-16
char input[256];
do{
    cout<<"..."; //prompt
    scanf("%s",&input5); //user inputs string
    if(strcmp(input5,"block")==0)
    {}                                 //if the user types block, then it finishes the loop and goes to the cout at the bottom
    else if(strcmp(input5,"attack")==0)
    {
        cout<<"..."<<endl;
    }
    else if(strcmp(input5,"look")==0)
    {
        cout<<"..."
    }
    else
    {
        cout<<"..."<<endl;
    }
}while(strcmp(input5,"block")!=0); //loop ends when block is typed
cout<<"...";

我在循环时遇到问题。我正在为学校做一个涉及文本冒险游戏的项目。用户正在提示如何响应攻击。所需的命令是"block",它将用户移动到下一个序列。当在扫描中输入"块"时,它会无休止地循环并打印处于"其他"状态的内容。我看不出问题是什么,感谢所有反馈。

我刚刚尝试了您的代码,它工作正常(尽管我删除了扫描中的 &(,并创建了"input5"作为字符数组。

撇开这一点不谈,您可能想要更改一些事情。我会坚持使用"cin"而不是scanf,因为你混合了C和C++。这将允许您为"input5"使用"字符串",并使用"=="运算符比较它们,这要干净得多。也许也可以考虑一个比"input5"更具描述性的名称,就像你有很多"inputX"变量一样,那么事情就会变得混乱。

编辑:我也会避免"使用命名空间 std;",因为您最终可能会发生命名冲突。

很可能你不需要 & 运算符在 scanf 行的 input5 之前,因为 scanf 期望 %s 字段的东西已经是指针/数组。虽然我没有看到 input5 是如何声明的,所以我不确定这是否是(唯一的(问题。您还应该将其包含在代码片段中。

编辑:只是一个注意:混合C风格(scanf(和C++风格(cout(IO并不是特别优雅。你不会有这个问题。

显然,循环不会终止,因为字符串比较不返回相等性。这一定是因为input5不包含类型化的输入(出于同样的原因,无论输入如何,都会执行else子句(。

由于input5只是通过scanf调用进行修改,因此这一定是邪恶的根源。一个简单的调试会话会立即显示它。

原因很简单:你必须传递scanf缓冲区的地址,但你实际上是在传递地址的地址,并覆盖变量input5的值(我们没有声明,但可以推断char*const char*(。

在 32 位环境中,这可能会通过覆盖堆栈而导致崩溃。在 64 位以下,您需要更多键入才能获得它。