C ++ int或双输入

时间:2013-09-25 16:00:49

标签: c++ input int double

我正在寻找清理一些已经运行的代码。首先,这是一个赋值,赋值指定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() == '.')是一个更好的选择,但我很好奇什么是最好的方式来完成我想要在这里完成的事情。有什么想法吗?

请不要把它变成“哦,这是家庭作业。”我想强调的是,我的课程已经超出了家庭作业的额外学分所要求的范围。我只是想了解更多关于语言的知识以及处理这种输入的最佳方法。

3 个答案:

答案 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,看看它是否可能不是一个整数,取决于结果解析为intdouble。例如

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