Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 验证c+中的双精度+;_C++_Validation_Double - Fatal编程技术网

C++ 验证c+中的双精度+;

C++ 验证c+中的双精度+;,c++,validation,double,C++,Validation,Double,我对编码一无所知,所以在评论之前请记住这一点 所以我试着学习编码有一段时间了,今天我去了图书馆 然后拿起一本书叫《c++编程》。我写了一些基本程序, 但有一点我被卡住了,我不知道如何创建一个 确保当提示用户输入double时,他们输入的内容有效。 (如果用户输入类似“k”的字符,程序将中断)。 我在这里和网上搜索了一下,找到了一些答案,但这些答案更多 “这是一行有效的代码,在其中插入x,y,z”。我不知道 有足够的经验知道该做什么。下面是一个混合代码的示例 从另一个问题来看,我没能在我的程序中实

我对编码一无所知,所以在评论之前请记住这一点

所以我试着学习编码有一段时间了,今天我去了图书馆 然后拿起一本书叫《c++编程》。我写了一些基本程序, 但有一点我被卡住了,我不知道如何创建一个 确保当提示用户输入double时,他们输入的内容有效。 (如果用户输入类似“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;
}
#包括
#包括
使用名称空间std;
double GetDouble(){
双x;
cin>>x;
int valid=0;
while(有效==0){
如果(x==double){
返回x;
打破
}如果(x!=双精度){

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

首先,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时,循环将结束。这似乎与(大部分)工作的代码非常相似:

double-GetDouble(){
双x;
cin>>x;
//ver1:while(cin.fail())//或!cin.good()无尾随字符检查。
而(cin.fail()| |(cin.peek()!='\r'和&cin.peek()!='\n'))
{
cout x;
}
返回x;
}
类似这样:

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;
}

出于好奇,你从哪里得到的这个代码?(我指的是你应该学习C++使用一本书)检查<代码> CIN。()(代码)> <代码> CIN > x;<代码>。然后你可以<代码> CIN。CULL()(代码)>和<代码> CIN。忽略(1000,'\n)
如果您愿意,可以分别清除标志和清空缓冲区。嗨,Luchian Grigore!我相信原始代码来自卡萨布兰卡的答案。(我确实先搜索了一下,但正如我所说,这没有什么帮助),它的混乱版本就是我试图理解它之后在这个线程顶部看到的:)上一次我检查了
cin.clear()
只清除了标志。也许你想的是
cin.ignore()
?注意:
if(cin)
只是
if(!cin.fail())
的缩写。同样,
cin>>x;if(cin)
是if(cin>>x)的长形式,因为操作符>>返回左侧流对象以允许链接。另外,
for(int i=10;i>0;i++)
将仅运行32000次,或20亿次或90五百万次迭代,具体取决于体系结构。通常是20亿次,在现代CPU上可能需要5秒。我无法在此处给出详细答案,但我编写了一段代码,与您的代码做了相同的事情,(我还尝试了您的代码以确保),两者都有一个缺陷,即如果用户输入了有效的内容,但在结尾处隐藏了无效的内容,即“123.45k”,那么它仍然会通过,并且只会切掉结尾部分(在本例中为k),我怎样才能让它仍然给出错误消息并重新提示输入?感谢所有的帮助人员,它帮助了很多人!@Paw好问题,我现在更新了答案(希望)有所改进。这很有效(至少到目前为止没有发现任何缺陷),非常感谢!no
cin.clear()
?这只是在第一个无效输入上疯狂循环。而且,
do…while()
实际上是
while(true)
。需要在
cin.ignore()
之前。这对我来说不编译,给我一个错误,说明“if(cin>>输入)中断”中没有在此范围内声明“input”部分。我想你的意思是写“userInput”,但它仍然没有编译,在“std::cin.igrone(std::numeric_limits::max(),'\n');”中有一个错误,它告诉我numeric_limits不是“std”的成员。我包括了库“iostream”和“stdio.h”另外,你能告诉我::做什么吗?
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);