我正在寻找清理一些已经运行的代码。首先,这是一个赋值,赋值指定int必须作为int,double兼作double,等等,否则我可能只是将输入作为double并转换为int if(number%1==0)
。
我已将代码修剪为仅处理输入(使用输出语句验证它是否正常工作)。
int wholePart=0;
double decimalPart=0;
cout << "Input a number: ";
cin >> wholePart;
if(cin.peek() != '\n')
cin >> decimalPart;
cout << "wholePart = " << wholePart << endl << "decimalPart = " << decimalPart << endl;
现在......这样可以正常工作,并且在我添加代码以处理组合整数和十进制(如果decimalPart不为0)之后,我已经完成了多个赋值调用,但我是希望学习,我想尽可能地清理这些代码。
我可以使用其他输入验证来包装整个输入部分,以确保用户实际输入数字而不是字符。但我最关心的是if(cin.peek() != '\n')
不够好。也许if(cin.peek() == '.')
是一个更好的选择,但我很好奇什么是最好的方式来完成我想要在这里完成的事情。有什么想法吗?
请不要把它变成“哦,这是家庭作业。”我想强调的是,我的课程已经超出了家庭作业的额外学分所要求的范围。我只是想了解更多关于语言的知识以及处理这种输入的最佳方法。
答案 0 :(得分:2)
我认为像"1.0"
这样的东西应该被视为
一个双倍;这几乎消除了类似的东西
读取一个double,然后检查它是否实际上是一个整数。
唯一的方法是解析数据,看看你是否遇到过
可以解释为int
的东西。如果你是
要使用流的转换功能,这很漂亮
很多意味着扫描输入两次。显而易见的解决方案
将输入放入字符串中;这些更容易
扫描多次。如果你不被允许这样做,你可以
使用istream::tellg
记住位置,向前扫描,然后一次
你决定,istream::seekg
回到你开始的地方
从。但我不知道你的导师强加了什么规则。
如果你不能寻求,你可以尝试手工黑客攻击。首先阅读
int
,然后查看下一个字符。如果它是'.'
,那么你
然后可以读一个double,它会给你小数部分,
你可以添加到你已经读过的整数。如果它是
一个'E'
或'e'
,它变得有点困难;您
可能必须提前,读取一个int,并手动使用pow
。
但这远非完美:如果双重形式
"1.2E6"
,你最终会得到200000作为“分数”部分;
你需要一些方法来检测这个,并缩放
你读过的整数。如果数字是".3"
,那么你就可以了
读取整数时出错:您可以检查
这事先(但不要忘记"-.3"
),或重置错误
在做任何事之前。当然,这有可能
双重的组成部分不适合int
(或甚至
一个long long
)。
总而言之,这对我来说似乎有点人为。在实践中,你是 读入一个字符串,并在其中匹配正则表达式 为了确定你想要如何解释它。
答案 1 :(得分:1)
首先读取整行作为字符串可能更容易,检查小数点,然后将该行提供给字符串流,然后将其转换为int或double(取决于小数点是否可用) ):
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string line;
int anInteger;
double aDouble;
getline( cin, line );
stringstream ss( line );
if ( line.find( '.' ) == string::npos ) {
ss >> anInteger;
} else {
ss >> aDouble;
}
return 0;
}
答案 2 :(得分:0)
根据你的规范,我会读一个std::string
,看看它是否可能不是一个整数,取决于结果解析为int
或double
。例如
int integer;
double number;
std::string value;
if (std::cin >> value) {
if (value.find_first_of(".Ee")) {
if (std::istringstream(value) >> number) {
std::cout << "read double=" << number << '\n';
}
else {
std::cout << "failed to read double from '" << value << "'\n";
}
}
else {
if (std::istringstream(value) >> integer) {
std::cout << "read integer=" << integer << '\n';
}
else {
std::cout << "failed to read integer from '" << value << "'\n";
}
}