Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++;测试输入是否为双精度/char_C++_Input_Loops - Fatal编程技术网

C++ C++;测试输入是否为双精度/char

C++ C++;测试输入是否为双精度/char,c++,input,loops,C++,Input,Loops,我正在尝试从用户那里获取输入,需要知道一种让程序识别输入是还是不是双字符/字符的方法这就是我现在拥有的。。。但当您键入错误的输入类型时 1) 双重测试一个只是内环 2) 即使输入正确,char one也不会停止循环 int main () { double _double = 0; bool done = true; while ( done ) { cout << "Please enter a DOUBLE:\n" << endl; c

我正在尝试从用户那里获取输入,需要知道一种让程序识别输入还是不是双字符/字符的方法这就是我现在拥有的。。。但当您键入错误的输入类型时 1) 双重测试一个只是内环

2) 即使输入正确,char one也不会停止循环

int main () {
    double _double = 0;
    bool done = true;
while ( done ) {
    cout << "Please enter a DOUBLE:\n" << endl;
    cin >> _double;
    if ( _double > 0 ) { done = false; }
    if ( _double < 0 ) { cout << "\nthe number you entered was less than zero\nplease enter a valad number..." << endl; } 
    if(cin.fail()) { cin.clear(); }
}

done = false;
char _char = ' ';
while ( !done ) {
    cout << "Please enter a CHAR" << "\n";
    cout << "\t'y' = yes\n\t'n' = no" << endl;
    cin >> _char;
    if ( _char == 'y' || _char == 'n' ) { done = true; }
    if ( ! (_char == 'y' || _char == 'n') ) { cout << "\nyou have entered an invald symbol... \n" << endl; }
    if(cin.fail()) { cin.clear(); }
}
int main(){
double _double=0;
bool done=true;
虽然(完成){
不能加倍;
如果(_double>0){done=false;}

如果(_double<0){cout最好的办法是始终将输入读取为字符串。然后可以使用诸如
std::strod()
之类的函数来测试并转换为double。检查流是否失败,然后重置流最多是容易出错的,并且不会产生好的错误消息

例如:

string s;
cin >> s;
char * p;
double d = strtod( s.c_str(), & p );
if ( * p == 0 ) {
   cout << "Read double: " << d << endl;
}
else {
   cout << "Read string: " << s << endl;
}
字符串s;
cin>>s;
char*p;
双d=strtod(s.c_str(),&p);
如果(*p==0){

cout
cin>\u double
将始终为您提供一个double,无论他们键入的是“42”、“0”还是“mary had a little lamb”。您需要将用户输入读取为字符串,然后测试该字符串是否为double。如果无法将输入字符串转换为所需类型,sscanf将返回0:

cout << "Please enter a DOUBLE:\n" << endl;
    string s;
cin >> s;
    if( !sscanf(s.c_str(), "%lf", &_double) )
    {
        done = false;
        cout << "Not a number, sparky. Try again." << endl;
        continue;
    }
cout;
如果(!sscanf(s.c_str(),%lf“,&u double))
{
完成=错误;

cout问题在于,当您读取某个内容时,
cin
发现输入永远不会是双精度的,它会停止读取,将未消耗的内容留在缓冲区中。它会发出失败信号,您可以清除该信号,但不会吃掉剩余的
cin
未消耗的输入。因此,下次尝试相同的错误输入时,请不要尝试再读一遍,再读一遍

char
one的问题是,您必须按回车键才能使其处理大多数终端上的任何字符(例如,如果您使程序从文件读取,则不会发生这种情况)。因此,如果您按
y
,则它不会退出读取调用,直到您按回车键。但是,它将正常继续并退出循环

正如其他人提到的,你最好阅读整行,然后决定做什么。你也可以用C++流代替C函数来检查数字:

bool checkForDouble(std::string const& s) {
  std::istringstream ss(s);
  double d;
  return (ss >> d) && (ss >> std::ws).eof();
}
这将读取任何初始的双精度数字,然后读取任何剩余的空白。如果它随后点击
eof
(文件/流的结尾),则表示该字符串仅包含双精度数字

std::string line;
while(!getline(std::cin, line) || !checkForDouble(line)) 
  std::cout << "Please enter a double instead" << std::endl;
std::字符串行;
而(!getline(std::cin,line)| |!checkForDouble(line))

std::cout和它不起作用?你能指定输出和预期输出吗?它能让你更快地回答问题。显然,你输入的任何字符都是一个字符。该测试怎么可能失败?代码表明你在寻找一个特定的字符,特别是
'y'
'n'
。哈哈,是的,'\uu'只是为了给你一个更简洁的答案例如源代码实际上,您可以测试
cin>\u double
的结果:
如果(cin>\u double)done=true;否则如果格式说明符错误,则它必须是“%lf”。使用“%f”在双人间中填充一个浮球。这有点像两者中最糟糕的。哇,Johannes Schaub-litb,非常感谢!你不知道你节省了我多少时间。谢谢!
std::string line;
while(!getline(std::cin, line) || line.size() != 1) 
  std::cout << "Please enter a double instead" << std::endl;