如果用户输入带小数的数字,如何显示浮点;如果用户使用函数重载输入整数,如何显示int 我现在正在通过观察学习C++。< /P>

如果用户输入带小数的数字,如何显示浮点;如果用户使用函数重载输入整数,如何显示int 我现在正在通过观察学习C++。< /P>,c++,C++,在教程中,他展示了如何使用函数重载 但是a和b的变量值在他的教程视频中是固定的。 我想知道如果用户需要输入一些东西(十进制或整数),会发生什么 以及如何让程序识别输入数据是int还是float 以下是教程视频中的代码: #include <iostream> using namespace std; void printnumber(int x){ cout << "I am printing an integer " <<x << en

在教程中,他展示了如何使用函数重载 但是
a
b
的变量值在他的教程视频中是固定的。 我想知道如果用户需要输入一些东西(十进制或整数),会发生什么 以及如何让程序识别输入数据是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);

}
#包括
使用名称空间std;
无效打印编号(整数x){

cout您将从
cin
返回一个
std::string
,一旦检测到它是否有点,您需要将其转换为适当的类型

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));
}

这并不像人们想象的那么简单。一种方法是将输入读取为字符串,然后查看该字符串是否包含小数点(这会在小数点为逗号的区域设置中导致问题)

另一种解决方案是读取字符串,然后尝试读取,如果读取失败,则尝试读取

我推荐最后一种方法


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

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

float b;
std::cout << "Enter a floating point value: ";
std::cin >> b;
inta;
std::cout>a;
浮球b;
std::cout>b;
然后希望用户实际输入正确的值。

intmain(){
int main(){

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

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

}
字符串a; cout>a; 打印编号((int)a); 打印编号((浮动)a); }
您在运行时才获得数据,因此在编译时无法知道类型,而编译时正是确定函数重载的时候。因此,您需要在运行时做出一些决定

我建议你查阅我最喜欢的C++书籍,Jim Coplien的高级C++编程风格和习语。请注意字母/信封习惯用法,它描述了如何实现你想要的。
对于这个简单的例子来说,这可能有些过分,但它值得学习,因为您正在寻找知识。

Joachim说得对,这不是一件小事。正确的做法是使用解析器

编写这样一个解析器并不难——它只需要检查数字的格式是否正确,方法是尝试将其作为任何一种类型读取,如果不起作用则重试

下面是一个简单(但有些复杂)的解决方案:

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));
}
这将检查是否转换了整个字符串,而不仅仅是部分字符串

注意,这个解决方案不太健壮,因为它没有正确的错误检查。在实际应用中,我强烈建议使用Boosi.Quy方法,因为它使代码更简单和更健壮,但它需要更深的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);
}
结构打印机:boost::static\u visitor{ 模板 void运算符()(T常量和值)常量{printnumber(值);} }; int main(){ std::字符串值; 标准:cin>>值; 名称空间qi=boost::spirit::qi; 自动开始=标准::开始(值); 自动常量结束=标准::结束(值); boost::变量结果; bool success=qi::parse(开始,结束,(qi::int_>>!qi::lit('.'))| qi::float_>>,结果); 如果(未成功或开始!=结束)
cerr用户可以输入任何内容,甚至只是一个字符串。您应该控制用户输入,检查它是否可转换为所需类型,如果可以,则将该值用于变量。您的变量应该是严格类型的。示例仅显示,在特定情况下,您可以根据变量的类型更改输出。您可以要求用户输入int首先是数字,然后是浮点。然后用你的函数打印两个变量。嗯。用户只需要输入一次怎么样?@user3490590如果你想要两个数字,那么你不能有一个输入。你可以有一个输入语句:
std::cin>>a>>b
。这是一个语句,但有两个输入。是的,糟糕的是:这不是如何将 STD::String >到C++中的数字。
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));
}
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);
}