2014-10-29 45 views
0

我需要确定用户输入到系统中的内容。基本上,如果我要求用户输入他的年龄,那么用户可能会输入浮点值,整数值或双精度值。如果用户输入整数值,那么程序应该存储一个整数,否则存储双精度浮点数。以下是我写的一个基本程序,用户提示输入他的年龄。 atm我只能将年龄存储为函数中的整数。确定功能中用户的输入类型

#include <cstdlib> 
#include <iostream> 
#include <string> 

using namespace std; 
void input(string,void *age); 

int main() 
{ 
    int age; 
    input("What is your age : ", &age); 
    cout<<age; 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

void input(string str,void *age) 
{ 

    int *pointer=(int*) age; 
    cout<<str; 
    cin>>*pointer; 
} 

我想在这里做的是 - 你看到函数指针中的指针,我希望程序明确指向用户输入的数据类型。例如,如果用户输入了一个浮点数,那么该函数应该指向一个浮点数并将其值存储为一个浮点数。但是,上面的代码并不完整,因为main()中的函数只允许int作为参数,我需要将其更改为接受任何类型的数据类型并进行相应的存储。

还有一件事情,只有当有一种方法来检查用户在将特定类型声明为特定类型之前输入的内容为int来存储“年龄”,那么我可以完成它。

+2

你在想这个。如果您的程序可以接受非整数年龄段,则将其作为浮点数存储。 – 2014-10-29 00:49:46

+0

有没有办法....? – 2014-10-29 01:20:28

+0

12.5是一个浮点还是双点? – 2014-10-29 01:36:19

回答

1

如果用户输入了一个浮点数,那么该函数应该指向一个浮点数并将其值存储为一个浮点数。

整数可以存储在一个浮动,并且可以测试一个浮动或双,看它是否只是一个整数

How to check if float is a whole number?

你不想

你的信仰在像3这样的情况下浮动(当你接受3.14的量化时) - 而是想要一个整数 - 实际上只是给你带来麻烦。 : -/

iostream操作符的概念是,你已经声明了你想要的类型,它看看它是否可以得到你的...如果没有错误处理。

可以想象,您可以定义自己的“变体”类型,或者使用诸如Boost.VariantQt's QVariant之类的东西。然后你可以用一些逻辑来编写一个iostream输入处理程序,如“如果它可以是一个整数,则作为第一选择。如果不尝试,使其成为浮点数或双精度。如果你有像3.52X7这样的东西,一串“。当然,那么你最终得到一个关于结果变体的大声明switch声明,看看你觉得你有什么样的输入。

一个比较简单但等效的通用方法可能是读取一个字符串作为初学者,然后尝试使用例如stoistof的例程。在C++ 11之前,类似的功能可以通过Boost的lexical_cast获得。基本上读入一个字符串,然后尝试stoi并捕获invalid_argumentout_of_range例外。如果没有例外,你已经有了你的整数。否则请尝试stof并查看是否有效。如果不是,则会发生错误。 (在这种简单的情况下,你可以等效地从流中读取一个整数,看看它是否失败,然后尝试读取一个浮点数,然后使用联合来表示结果,但是如果你一般地试图筛选更多的类型喂一个变体,你可能想读一个字符串,并进行任意处理;这些是一些例程要知道。)

但是,为什么你会这样做?动机是什么?只是读一个浮动或双。

+0

我们可以有一个覆盖函数,它将整数作为参数,其他作为float作为参数,并将参数参数设置为void,然后检查用户输入的内容。但是仍然要输入用户输入,我们必须指定数据类型。那么有没有办法让用户输入一种无效的数据类型?通过字符串在这种情况下工作的方式。以字符串作为用户输入,然后检查是否有小数点是一个方便的做法..但我真的不明白为什么这个问题已经忍受了我的讲师。他说用户可以输入任何数据类型,我们必须保存一致 – 2014-10-29 20:45:29

0

输入流没有输入数据类型的概念。你问它的数据类型,它会尽力给你,如果可以的话。

如果你真的需要确定型(整数VS浮点数),你将不得不读取输入的std::string第一和解析它自己,看是否有小数点存在,如:

#include <cstdlib> 
#include <iostream> 
#include <string> 
#include <locale> 

using namespace std; 

void input(string, string*); 

int main() 
{ 
    string value; 
    input("What is your age : ", &value); 

    istringstream iss(value); 

    char dec = use_facet<numpunct<char> >(iss.getloc()).decimal_point(); 
    if (value.find(dec) != std::string::npos) 
    { 
     double age; 
     if (iss >> age) 
      cout << age; 
    } 
    else 
    { 
     int age; 
     if (iss >> age) 
      cout << age; 
    } 

    if (!iss) 
     cout << "Invalid Age entered"; 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

void input(string str, string *value) 
{ 
    cout << str; 
    getline(cin, *value); 
}