0

我对编码完全陌生,所以在评论之前请记住这一点。

所以一段时间以来我一直在尝试编码,今天我去图书馆取了一本书,叫做《c++编程》。我已经编写了一些基本程序,但我一直卡在某个点上,我不知道如何创建一个函数,以确保当提示用户输入双精度时,他们输入的内容是有效的。(如果用户输入像“k”这样的字符,程序就会中断)。我在这里和网上搜索,有一些答案,但它们更多的是“这是一行有效的代码,将 x、y、z 插入其中”。而且我没有足够的经验知道该怎么做。所以这是一个混合了另一个问题的代码的示例,我未能尝试使其在我的程序中工作:

#include <iostream>
#include <stdio.h>


using namespace std;

double GetDouble () {
    double x;
    cin >> x;
    int valid = 0;
    while (valid == 0) {
        if (x == double) {
      return x;
      break;
  } else if (x != double) {
      cout << "Invalid Input! Please input a numerical value." << endl;
      cin.clear();
      while (cin.get() != '\n') ; // empty loop
    }
}
return x;
}

现在我想要它做的是使用“cin << x”来获取用户对 x 的输入,然后确保 x 是双精度数,而我在这方面非常失败。如果有人能以澄清每个操作的方式解释这一点,我将不胜感激。例如,我不知道break函数是做什么的,cin.clear()和cin.get()是做什么的。(我知道这是重复的,但是另一个问题的答案根本没有解决我的困惑,感谢您花时间阅读和回答这个问题!:)

4

4 回答 4

2

这似乎与您的(大部分)有效的代码非常相似:

double GetDouble () {
    double x;
    cin >> x;
    // ver1: while( cin.fail() ) // or !cin.good()   no trailing char check.
    while( cin.fail() || (cin.peek() != '\r' && cin.peek() != '\n'))
    {
        cout << "Invalid Input! Please input a numerical value." << endl;
        cin.clear();
        while( cin.get() != '\n' ); // or cin.ignore(1000, '\n');
        cin >> x;
    }
    return x;
}
于 2013-07-19T16:45:24.120 回答
1

首先,double 是一个关键字,因此您不需要在条件语句中使用它。其次,您可以在 while 循环中使用 cin>>x ,然后处理 x ,示例代码如下:

    while(cin>>x)
     {
       //process
     }

每当您在 while 语句中使用任何内容时,它首先会检查它的有效性。例如,如果用户输入一个字符,则条件将评估为 false,然后您可以将其告诉用户。通过这种方式,您可以运行循环,直到用户输入正确的输入。至于break关键字的作用,它可以让你跳出循环,例如

    for(int i=10; i>0; i++)
    {
       // do something
    }

将永远运行,但假设您将代码重写为:

    for(int i=10; i>0; i++)
    {
      if(i==15)
      break ;
    }

一旦 i 的值达到 15,循环就会结束

于 2013-07-19T16:26:45.787 回答
0

像这样:

double getDouble(const string& askMessage = "Please Enter a number: ",const string& errorMessage = "Please enter a valid number: ", const int numberOfTrials = 10){
 double userInput = 0.0;
 bool isValidInput = false;
 int trials = 0;
 do{
    cout << endl << askMessage;
    if(cin >> input) break;
    else{ 
      cin.clear(); //EDIT thanks ebyrob, forgot about this.
      std::cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
      std::cout << errorMessage;
    }

 }while(!isValidInput || trials < numberOfTrials);

 return userInput;
}

像这样使用它

const double d1 = getDouble();
const double d2 = getDouble("Please Enter a number: ", "Error! Enter a valid number: ", 1000);
于 2013-07-19T19:18:18.210 回答
-1

Break 打破循环(在这种情况下,是一段时间) cin.clear() 清除所有字符的 cin 缓冲区。cin.get() 从 cin 获取单个字符(可能是标准输入)。

于 2013-07-19T16:21:56.530 回答