【问题标题】:What is the relevance of if (!(cin >> variableName)) in this loopif (!(cin >> variableName)) 在这个循环中的相关性是什么
【发布时间】:2017-09-16 02:39:51
【问题描述】:

我是一名自学成才的开发人员,试图学习 c++,我在 google 上找到了这个练习,并为它编写了代码,虽然我的所有条件都是正确的,但它不起作用,当我检查他们的答案时,我发现这行代码 - if (!(cin >> guess))。老实说,我没有看到相关性,我不知道为什么它使我的循环不起作用。这是我的代码:

int main(int argc, char* argv[])    
{

int nUserRandNum = 0;
    int randomNumber=0;

    srand (time(NULL));
    randomNumber = rand() % 100 + 1;

    printf("Please enter a random number between 1 - 99 \n");

    scanf("%d", &nUserRandNum);


    do
    {
        if (randomNumber < nUserRandNum)
        {
            printf("Try to go a little higher than \n", nUserRandNum);
        }
        else
        {
            printf("You might want to go a little lower than \n", nUserRandNum);    
        }
    }
    while (randomNumber != nUserRandNum);

    printf("You got it!!!");

    system("Pause"); 

    return 0;
}

当我检查他们的答案时:

int random_number, guess;

// Initialize random seed.
srand (time(NULL));

// Generate random number between 1 and 100
random_number = rand() % 100 + 1;

cout << "Guess our number (1 to 100) ";
cin>>guess;
do 
{
    if (!(cin >> guess)) 
    {
      cout << "Please enter only numbers" << endl;
    } 
    else 
    {
      if (random_number < guess) 
          cout << "The secret number is lower than " << guess << endl;
      else if (random_number > guess) 
          cout << "The secret number is higher than " << guess << endl;
    }
} while (random_number != guess);
cout << "Congratulations!" <<  endl;

if 语句对{if (!(cin &gt;&gt; guess)) } 做了什么?还有其他原因我的循环不起作用吗?

【问题讨论】:

  • 您不会在循环中读取答案 - 您的用户只会得到一个猜测。
  • cin &gt;&gt; guess 是输入操作——它从标准输入流中读取下一个输入值并将其存储在guess 中。由于您正在读取整数变量,因此如果输入字符串不是有效的整数常量(包含数字以外的内容),则操作将失败(评估为假)。如果您输入的不是整数,您会收到 "Please enter only numbers" 消息 - 否则它将输入与随机数进行比较。
  • 扩展至@JohnBode 对正在发生的事情的评论:Why and how it happens。更多详情:en.cppreference.com/w/cpp/io/basic_ios/operator_bool

标签: c++ loops random do-while


【解决方案1】:

if (!(cin &gt;&gt; guess)) 语句可以理解为“如果输入数字不成功”,所以如果用户输入的类型确实是 int,(cin &gt;&gt; x) 为 true。 Nitpick:顺便说一句,你把“走低”换成了“走高”。

【讨论】:

  • 这只处理了大约 1/3 的 OP 问题。您应该详细说明 OP 的尝试失败的原因。
  • 其他答案已经解释过了,我正在解决标题中的问题。
【解决方案2】:

scanfcin &gt;&gt; 之间的区别在这里无关紧要,这不是它起作用的原因。

这就是你所拥有的:

scanf("%d", &nUserRandNum);
do
{
    ... print ...
}
while (randomNumber != nUserRandNum);

您的scanf 在循环之外。因此,当满足do...while 条件时,用户已经输入的同一个号码被再次检查。

这需要在循环体内,像这样:

do
{
    scanf("%d", &nUserRandNum);
    ... print ...
}
while (randomNumber != nUserRandNum);

cin 读取输入而不是使用scanf 可能是个好主意,因为它不太容易出错。 (尽管您显示的代码仍然可以做到这一点。)

检查一个数字是否被成功读取可能也是一个好主意。当用户输入随机垃圾时,您不应将其视为用户输入了一个数字。

但这些都不是你的问题的原因。

【讨论】:

  • 天哪!我现在完全理解了,因为 scanf 不在循环中,他只能输入一次,所以循环永远继续下去。祝福你!

    好的,我会确保在循环运行之前验证输入的是数字。谢谢

猜你喜欢
  • 2012-06-16
  • 2022-06-17
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多