确定函数中用户的输入类型

时间:2014-10-29 00:46:43

标签: c++

我需要确定用户输入系统的内容。基本上,如果我要求用户输入他的年龄,那么用户可能会输入浮点值,整数值或双精度值。如果用户输入整数值,那么程序应该存储一个整数else store store double else float。以下是我写的基本程序,用户提示输入他的年龄。 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以存储&#34; age&#34;之前,才有办法检查用户输入了什么。然后我就可以完成它。

2 个答案:

答案 0 :(得分:1)

  

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

整数可以存储在float中,并且可以测试float或double以查看它是否只是一个整数:

How to check if float is a whole number?

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

iostream运算符的概念是你已经声明了你想要的类型,它会看到它是否可以为你获取...如果没有错误处理。

可以想象你可以定义自己的变种&#34;输入,或使用Boost.VariantQt's QVariant之类的内容。然后你可以编写一个带有某些逻辑的iostream输入处理程序,如&#34;如果它可以是一个整数,那就把它作为第一选择。如果没有尝试,使它成为一个浮点数或双倍。如果你有类似3.52X7的东西后退并使其成为一个字符串&#34; 。当然,最后你会得到一个关于结果变体的大switch语句,看看你觉得你得到了什么样的输入。

一个更简单但相当的通用方法可能是读取字符串中的初学者,然后尝试使用stoistof等例程。在C ++ 11之前,Boost的lexical_cast提供了类似的功能。基本上是在字符串中读取,然后尝试stoi并捕获invalid_argumentout_of_range例外。如果没有例外,你就得到了你的整数。否则请尝试stof并查看是否有效。如果没有,则会陷入错误。

(在这个简单的例子中,你可以等同地尝试从流中读取一个整数,看看它是否失败,然后尝试读取一个浮点数。使用一个联合作为你的结果。但是如果你通常试图筛选更多的类型来提供一个您可能想要读取字符串并进行任意处理的变体;这些是一些需要了解的例程。)

但又一次......你为什么要这样做?动机是什么?只需读一个浮点数或双倍。

答案 1 :(得分:1)

输入流没有输入数据类型的概念。你问它是否有数据类型,如果可以,它会尝试给你。

如果确实需要确定类型(整数与浮点数),则必须首先将输入读作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);
}