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<<"...";
我在使用while while循环时遇到问题。我正在为学校做一个涉及文本冒险游戏的项目。用户正在提示如何响应攻击。所需的命令是“阻止”,它将用户移动到下一个序列。当“block”被输入scanf时,它会无休止地循环并打印处于“其他”状态的内容。我不知道问题是什么,所有的反馈都得到了赞赏。
答案 0 :(得分:2)
我只是尝试了你的代码并且它工作正常(虽然我删除了&amp; in scanf),并创建了'input5'作为char数组。
尽管如此,您可能想要改变一些事情。我坚持使用'cin'而不是scanf,因为你正在混合使用C和C ++。这将允许您使用'string'作为'input5',并使用'=='运算符进行比较,这更加清晰。也许想想一个比'input5'更具描述性的名字,好像你有很多'inputX'变量,那么事情会变得混乱。
编辑:我也不会使用“使用namespace std;”,因为你最终可能会命名冲突。
答案 1 :(得分:0)
很可能你不需要&amp; scanf行上的input5之前的运算符,因为scanf期望的%s字段已经是指针/数组。虽然我没有看到input5是如何声明的,所以我不确定这是否是(唯一的)问题。您应该将其包含在代码段中。
编辑:请注意:混合使用C风格(scanf)和C ++风格(cout)IO并不是特别优雅。你不会有cin这个问题。答案 2 :(得分:0)
显然,循环不会终止,因为字符串比较不会返回相等。这必须是因为input5
不包含输入的类型(出于同样的原因,无论输入如何都会执行else
子句。)
由于input5
仅由scanf
调用修改,因此必须是邪恶的根源。一个简单的调试会话就会立即显示出来。
原因很简单:您必须传递scanf
缓冲区的地址,但实际上是在传递地址的地址,并覆盖变量input5
的值(我们不知道没有声明,但可以推断char*
或const char*
)。
在32位环境中,这可能会因覆盖堆栈而导致崩溃。在64位以下,您需要更多的输入才能获得它。