如果用户输入带小数的数字,如何显示浮点;如果用户使用函数重载输入整数,如何显示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);
}