我目前正在通过观看bucky's C++ tutorial来学习C ++。
在教程中,他展示了如何使用函数重载
但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);
}
虽然这是我创建的代码:
#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);
}
答案 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);
}