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 位以下,您需要更多键入才能获得它。