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