如果用户输入带小数的数字,则如何显示浮点数;如果用户使用函数重载输入整数,则如何显示

时间:2014-04-04 09:11:37

标签: c++

我目前正在通过观看bucky's C++ tutorial来学习C ++。

在教程中,他展示了如何使用函数重载 但ab的变量值在他的教程视频中已修复。 我想知道如果用户需要输入内容(十进制或整数)会发生什么 以及如何使程序识别输入数据是int还是float。

这是教程视频中的代码:

#include <iostream>
using namespace std;

void printnumber(int x){
    cout << "I am printing an integer " <<x << endl;
}

void printnumber(float x){
    cout << "I am printing an float: " << x << endl;
}


int main(){

    int a = 54;
    float b= 32.4896;

    printnumber(a);
    printnumber(b);

}

虽然这是我创建的代码:

#include <iostream>
using namespace std;
int a;
float b;

void printnumber(int x){
    cout << "I am printing an integer " <<x << endl;
}

void printnumber(float x){
    cout << "I am printing an float: " << x << endl;
}


int main(){

    cout << "enter a whole number or a number with decimal: ";
    cin >> ; //what will i put here?

    printnumber(a);
    printnumber(b);

}

5 个答案:

答案 0 :(得分:2)

这并不像人们想象的那么简单。一种方法是将输入作为字符串读取,并查看字符串是否包含小数点(这会导致小数点为逗号的语言环境出现问题)。

另一个解决方案是以字符串形式阅读,然后尝试convert it to a floating point value,如果失败则convert it to an integer

我会推荐最后一种方法。


或者为简单起见,只需指示用户输入一个整数后跟一个浮点值:

int a;
std::cout << "Enter an integer value: ";
std::cin >> a;

float b;
std::cout << "Enter a floating point value: ";
std::cin >> b;

然后希望用户实际输入正确的值。

答案 1 :(得分:0)

您将从std::string返回cin,一旦检测到它是否有点,您需要转换为相应的类型。

std::string user_input;

cout << "enter a whole number or a number with decimal: ";
cin >> user_input;

if(user_input.find('.') != std::string::npos){
  // we found a float (probably)
  // uses boost library to make stuff easier
  printNumber(boost::lexical_cast<float>(user_input));
}else{
  printNumber(boost::lexical_cast<int>(user_input));
}

而不是boost::lexical_cast您也可以使用std::stringstream

std::stringstream ss;
ss << user_input;
if(user_input.find('.') != std::string::npos){
  // we found a float (probably)
  float f;
  ss >> f;
  printNumber(f);
}else{
  int i;
  ss >> i;
  printNumber(i);
}

答案 2 :(得分:0)

在运行时之前不会获取数据,因此您无法在编译时知道类型,即确定函数重载时的类型。因此,您需要在运行时做出一些决定。

我建议你查看我最喜欢的C ++书籍,Jim Coplien的高级C ++编程风格和成语。要特别注意字母/信封的习语,它描述了如何完成你想要的东西。

这个简单的例子可能有点过分,但是因为你在寻找知识,所以值得学习。

答案 3 :(得分:0)

约阿希姆是对的,这不是微不足道的。 “正确”的方法是使用解析器。

编写这样的解析器并不太难 - 它只需要检查数字是否是正确的格式,尝试将其作为任一类型读取,如果不起作用则重试。 “更清洁”的解决方案是使用正式的解析框架,例如Boost.Spirit.Qi

这是一个直截了当(但有点复杂)的解决方案:

int main() {
    std::string value;
    std::cin >> value;

    std::size_t end;
    int intval = std::stoi(value, &end);
    if (end == value.size())
        printnumber(intval);
    else
        printnumber(std::stof(value));
}

这会检查std::stoi转换了整个字符串,而不只是部分字符串。

请注意,此解决方案不是非常健壮,因为它没有正确的错误检查。在实际的应用程序中,我强烈建议使用Boost.Qi方法,因为它使代码更简单,更健壮,但它需要更深入的C ++知识。

作为参考,使用解析框架的“正确”解决方案看起来像这样:

struct printer : boost::static_visitor<void> {
    template <typename T>
    void operator ()(T const& value) const { printnumber(value); }
};

int main() {
    std::string value;
    std::cin >> value;

    namespace qi = boost::spirit::qi;

    auto begin = std::begin(value);
    auto const end = std::end(value);
    boost::variant<int, float> result;
    bool success = qi::parse(begin, end, (qi::int_ >> !qi::lit('.')) | qi::float_, result);
    if (not success or begin != end)
        std::cerr << "Something went wrong\n";
    else
        apply_visitor(printer{}, result);
}

答案 4 :(得分:-1)

int main(){

string a;
cout << "enter a whole number or a number with decimal: ";
cin >> a;

printnumber((int)a);
printnumber((float)a);

}