2015-02-07 74 views
0

我是一名C++程序员,这只是我的第二个程序...这是美元和欧元之间的简单货币转换器。我遇到的问题是,如果我输入一个NaN值,它会这样说,然后再问,但是退出。有谁知道如何让它等到用户键入其他东西?也在第二个cin >> user_dollar我收到一个错误,说:“引用重载函数无法解析;你的意思是打电话吗?“对不起,这是如此之长,谢谢〜接收到NaN输入后,C++程序再次要求输入,然后退出

这是我的代码。我在MacBook Pro上使用Xcode。

#include <iostream> 
using namespace std; 


int main() { 
    string choice; 
    int user_dollar; 
    int user_euro; 

    cout << "Dollars to Euros (type ‘Dollars’) or Euros to dollars (type ‘Euros’)? "; 
    cin >> choice; 

    if (choice == "Dollars" || choice == "dollars") { 

     cout << "Enter dollar amount: "; 
     cin >> user_dollar; 
      if (isdigit(user_dollar) != true){ 
       cout << "That’s not a number... " << endl; 
       cout << "Enter dollar amount: " << endl; 
       *cin >> user_dollar;* 
       } 
      else { 
       cout << "That is " << user_dollar/1.13 << " Euros." << endl; 
       } 

    } 

    else if (choice == "Euros" || choice == "euros") { 

     cout << "Enter Euro amount: "; 
     cin >> user_euro; 

     cout << "That is " << user_euro * 0.89 << " dollars." << endl; 

    } 
} 
+0

1.你的程序没有循环。你希望它问'while'事情是真的。 2.阅读“std :: isdigit”的规范。 – philipxy 2015-02-07 00:41:59

+0

嗨,感谢您的快速回复!如果我把'while'而不是'if'表示只是打印出“这不是一个数字......”和“输入美元金额:”无休止地。另外我不确定'std :: isdigit'是什么意思... – Minnow 2015-02-07 00:56:45

+0

1.决定何时停止。没有那个循环。 (在一个循环内部做你想做的事情,确保底部已经准备好进行下一个测试。)2. isnan(x)表示x!= x表示x是NaN。搜索重新使用std :: isnan。 3.使用std :: isdigit重新搜索。 4.使用std :: cin重新搜索。除非你知道它的作用,否则不要调用函数。否则,你为什么要打电话? (修辞) – philipxy 2015-02-07 01:28:02

回答

0

你需要第二次使用的cin前冲洗cin缓冲区。像

cin.clear(); 
cin.ignore(INT_MAX,'\n'); 
cin >> user_dollar; 

东西看看这个thread上刷新缓冲区的更多细节。

0

由于user_dollar变量的类型是int,因此它只能包含一个整数。如果有人输入除数字之外的东西(如“hi”),则不能存储在user_dollar中。

当您拨打cin >> user_dollar,并且用户输入非数字时,它会失败并且不会更改user_dollar。由于没有其他设置user_dollar在那一点上,它可能是任何东西 - 半随机垃圾。您目前正在使用isdigit()检查垃圾。并且isdigit()不用于检查使用cin直接读取的整数。

您可以检查它未能通过调用fail()阅读数,使用clear()复位是否出现了错误,并ignore()刷新缓冲区为伊戈尔表示。

正如philipxy所说,您可以使用while循环继续询问,直到成功读取一个数字。

相关问题