【问题标题】:Program recognizes first text output, but not second text output程序识别第一个文本输出,但不识别第二个文本输出
【发布时间】:2016-03-30 06:40:43
【问题描述】:

我对 C++ 编程相当陌生,所以这可能是一个新手错误。但。 (为什么我不能隐藏我的其余代码......我想展示我正在做的所有事情......)

首先,我的代码开始看起来像这样(标题等,加上前几行代码)

#include <iostream>
#include <string>

using namespace std;

string command;    
string playername; 
char response;     

string object;  

int main()
{

    do
    {          
       cout << "What is your name? "; 
       cout << endl;

       cin >> playername; 
       cout << endl;

       cout << "Your name is " << playername << "? (Y/N)" << endl; 
       cout << endl;
       cin >> response; 

       cout << endl;
       cout << endl;

    } while ((response != 'y')&&(response != 'Y')); 
}

然后是问题所在:

do
{  
    cout << endl;
    cout << "What will you do?";  
    cout << endl;

    cin >> command >> object; 

    if ((command == "look")&&(object == "door")) 
       cout << "You look at the door. It appears to be but a simple wooden door
       with a brass handle for opening and shutting. "; 

    else if ((command == "Open")&&(object == "door")) 
       cout << "You open the door and proceed to the next room";

    } while ((command == "look")&&(command == "Look")); 
}

当我输入“look”和“door”(作为命令和对象)时,我的程序会识别并以适当的“It's a door”行响应。但是,当我输入“打开”和“门”时,它只是接受它并结束程序,而不显示文本。

如果有任何方法可以纠正这个问题,我将非常感激。

谢谢!

编辑:为了可读性 EDIT2:将最后一行更改为

}while ((command == "look")||(command == "Look")); 

我得到: the bulwarky that is this code

【问题讨论】:

  • 虽然编译器不关心格式和缩进之类的事情,但我们人类却关心。请尝试使用缩进来格式化代码,以便于阅读。
  • 啊抱歉:S 我很不习惯这个,只是想把所有东西放在一起..

标签: c++ loops c++11


【解决方案1】:

只有当command 同时是"look""Look" 时,表达式(command == "look")&amp;&amp;(command == "Look") 才会为真,这是不可能的并且会产生false 的条件。

你应该使用逻辑来代替:(command == "look")||(command == "Look")

【讨论】:

  • 另外,“Open”仅用大写 O 指定。可能值得注意。
  • 天哪,我知道。我已经尝试了所有看起来的方法。我注意到大写 O 和小 O。我试过 ||区分一切。我只是不知所措
  • 或者您可以使用 Boost 库将所有​​命令变为非大写字符。然后你不需要将你的命令与“look”和“look”进行比较,但是只需将命令与“look”进行比较就可以了。见stackoverflow.com/questions/3403844/…
  • Boost 需要我进行更多的研究,因为从那篇文章中我不明白它应该如何工作。谢谢,不过
  • 我发布的链接还提到了一个 STD 库解决方案:std::transform(command.begin(), command.end(), command.begin(), ::tolower);
【解决方案2】:

由于您的条件无效,您的读取和打印代码只能工作一次。我假设如果您输入“打开”和“门”作为您的第一个命令,您将获得打开的文本,然后程序停止。

您的程序将读取您的代码的原因是因为这样构建了一个 do-while 循环。它会执行一次循环,然后通过查看 while(..) 语句是否仍然有效来检查是否需要再次执行。


这里有一些关于 do-while 循环的额外信息。 http://www.tutorialspoint.com/cplusplus/cpp_do_while_loop.htm

引自链接网站:

C++ 中 do...while 循环的语法是:

do 
{ 
   statement(s);
}
while( condition ); 

注意条件 表达式出现在循环的末尾,因此 在测试条件之前循环执行一次。


我不确定您希望程序中的哪种行为;你想什么时候停止程序?如果您想继续寻找和打开门,我建议您将 while(..) 语句更改为

while (command != "stop");

这样程序将继续运行,直到您输入单词“停止”

【讨论】:

  • 我以为我做得对。只要用户输入看起来,我希望它循环,而不是当用户输入打开时。到目前为止(而且我确定我没有在主帖中正确解释这一点),我可以在我输入 look 时让它循环,这是预期的行为,但是当我进入 open 时,它不会显示文本我想。而只是终止程序。
  • 现在它这样做了:i.gyazo.com/83930a7d4932f7b588069473f4417a11.png 啊我不擅长这个......我想要的行为是:当用户看着门时循环。但是我希望它在用户打开门时显示文本“您打开门并继续.. blabla”。它目前没有这样做。顺便说一句,我真的很感谢你的帮助..
  • 尝试用大写 O 输入“Open”,因为您将它与 else if(..) 中的“Open”进行比较
  • 啊哈!这得到了我......哦,我的天哪,我觉得很傻。但现在当我打开时它也在循环......好吧。我会再修补一些。谢谢你们!
  • 我修好了。哦,非常感谢。它是固定的。它有效。
【解决方案3】:

您的问题取决于“开放”和“开放”之间的差异。这真的很难,所以检查这两种情况的所有字符串。所以也许你可以使用 std::toupper 函数。

试试这样的:

if(toupper(command) == toupper("open") && toupper(object) == toupper("door"))

编辑:参考toupper-function

【讨论】:

  • 我也会试试的。谢谢。
  • 没有匹配的函数来调用 toupper,它说。我需要一个标题吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多