程序流程的问题

时间:2015-04-21 04:39:57

标签: c++

所以我要先说这是我的第一篇文章。我已经打了一个台阶,无法​​找到一个为我工作的简单答案。

我很新,我还在命令行程序上但是在这里我想创建一个程序来接受用户的int值。我想检查并确认它实际上是一个整数值。如果不是,我希望告诉用户输入正确的整数值。如果它是正确的我想继续前进。我想继续询问正确的输入,直到用户给我一个整数值。

这是我一直试图做的事情:

#include <iostream>

using namespace std;

int main()
{

   int n;

   do {

      if (isdigit(n)==false) {
         cout<<"Enter an integer number\n";
         cin>>n;
         continue;
      }
      else {
         cout<<"Good Job\n";
      }
   } while(isdigit(n)==false);

}

你可能猜到这给了我一个无限循环。我不能因为我的生活而得到这样的表现我想要它。

3 个答案:

答案 0 :(得分:3)

你走在正确的轨道上。您正在执行以确定已成功读取整数的检查不正确。 isdigit用于检查单个字符是否为数字。 isdigit返回true的值范围为['0' - '9']。用整数表示,该范围是[48-57]。它不适用于您的目的。

这是一个应该有效的更新版本:

#include <iostream>

using namespace std;

int main()
{

   int n;
   while ( true )
   {
      cout << "Enter an integer number\n";
      if ( cin >> n )
      {
         cout<<"Good Job\n";
         break;
      }
      else
      {
         // Clear the stream and ignore the rest of the line.
         cin.clear();
         cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
      }
   } 
}

答案 1 :(得分:2)

这里有几个问题。

  1. 首先,当@ jrd1已关联时,您投射cin>>n的方式不完整。您的程序功能似乎需要某种验证,但如果输入不是数字,则cin会失败(请参阅integer input validation, how?Integer validation for input中使用cin.fail())。您必须检查cin是否失败,并为下一轮输入刷新cin

  2. 您的if声明和while声明之一是多余的,因为nwhileif的评估之间没有变化后续循环。

  3. 由于您必须检查cin是否失败,因此无需另外检查isdigit(n)。也就是说,如果cin没有失败,那么n必须是数字。

  4. 您的continue声明是多余的。 continue跳到循环的末尾,但这不是必需的,因为所有剩余的代码都在else块中,因此没有什么可以跳过。这仅在您想要在if块(您的代码没有)之后跳过任何代码时才有用。

  5. 您对else块的意图似乎表示验证成功。您可以考虑使用break语句,该语句会破坏当前循环中的代码执行。

  6. 一旦你考虑了所有这些,你就会得到类似@ R-Sahu的代码。

    这是一个与您的代码最相似的示例:

    #include <iostream>
    
    using namespace std;
    
    int main() {
    
        int n;
    
        do {
            cout<<"Enter an integer number\n";
            cin>>n;
    
            if(cin.fail()) {
                cout << "Wrong Input" <<endl;
                cin.clear(); 
                cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
            } else {
                break;
            }
    
        } while (true);
    
        cout<<"Good Job\n"<<endl;
    
    }
    

    这是另一个“更多”简化的示例,并且不需要breakcontinue语句(某些程序员可以选择更好的“可读”代码)

    #include <iostream>
    
    using namespace std;
    
    int main() {
    
        int n;
    
        cout << "Enter an integer number\n" << endl;
        cin>>n;
        while ( cin.fail()){
                cout << "Wrong Input. Enter an integer number\n" <<endl;
                cin.clear(); 
                cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
                cin>>n;
        }
    
        cout<<"Good Job\n"<<endl;
    
    }
    

    编辑:修复了第二个示例中! cin>>n未按预期运行的问题。

    EDIT2:解决了第一个示例中isdigit未正确应用的问题。见R Sahu的解释。

答案 2 :(得分:0)

感谢所有帮助人员,我终于能够使用ch41rmn建议的略微修改版本来运行代码。 “简化”版本直接绕过while循环。即使给出了正确的int值,第二个也没有退出。这是我用过的:

#include <iostream>

using namespace std;

int main() {

    int n;

    do {
        cout<<"Enter an integer number\n";
        cin>>n;

        if(cin.fail()) {
            cout << "Wrong Input" <<endl;
            cin.clear();
            cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
        else{
            break;
        }

    } while(isdigit(n)==false);

    cout<<"Good Job\n";

}

虽然这可能是多余的,但我很高兴SOB运行。

谢谢!