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<<"...";我的do while循环有问题。我正在为学校做一个项目,其中包括一种文字冒险类游戏。用户正在提示如何响应攻击。所需的命令是"block",它将用户移动到下一个序列。当在scanf中输入"block“时,它会无休止地循环并打印"else”条件中的内容。我看不出问题是什么,所有的反馈都很受欢迎。
发布于 2017-04-14 21:28:45
我刚刚试过你的代码,它工作得很好(尽管我去掉了scanf中的&),并将'input5‘创建为一个字符数组。
尽管如此,还是有一些你可能想要改变的东西。我坚持使用“cin”而不是“scanf”,因为你混合了C和C++。这将允许您使用‘字符串’作为'input5',并使用'==‘运算符比较它们,这是相当干净的。也许也可以想一个比'input5‘更具描述性的名字,如果你有很多'inputX’变量,事情就会变得一团糟。
编辑:我也避免“使用名称空间std;",因为您可能会以命名冲突而告终。
发布于 2017-04-14 21:24:44
很可能在scanf行的input5之前不需要&运算符,因为scanf期望%s字段的内容已经是指针/数组。虽然我不知道input5是如何声明的,所以我不确定这是否是唯一的问题。您也应该将其包含在代码片段中。
编辑:只需注意:混合C风格(scanf)和C++风格(cout) IO并不是特别优雅。使用cin就不会有这个问题。
发布于 2017-04-14 21:43:01
显然,循环不会终止,因为字符串比较不返回相等。这一定是因为input5不包含键入的输入(出于同样的原因,无论输入是什么,else子句都会被执行)。
由于input5仅由scanf调用修改,因此这一定是邪恶的根源。一个简单的调试会话就可以立即揭示它。
原因很简单:您必须向scanf传递缓冲区的地址,但您实际上是在传递地址的地址,并覆盖变量input5的值(我们没有声明,但可以推断出char*或const char*)。
在32位环境中,这可能会通过覆盖堆栈而导致崩溃。在64位下,你需要更多的输入才能获得它。
https://stackoverflow.com/questions/43412367
复制相似问题