繁体   English   中英

C ++ int或双输入

[英]C++ int or double input

我正在寻找清理一些已经运行的代码。 首先,这是一个赋值,赋值指定整数必须作为整数,双精度数等,否则我可能只是将输入作为双精度并转换为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() == '.')是一个更好的选择,但我很好奇什么是最好的方式来完成我想在这里完成的事情。 有任何想法吗?

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

我认为像"1.0"这样的东西也应该被视为双倍; 这几乎消除了读取double之类的内容,然后检查它是否实际上是一个整数。

唯一的方法是解析数据,看看你是否遇到了可以被解释为int东西。 如果您要使用流的转换函数,这几乎意味着扫描输入两次。 显而易见的解决方案是将输入放入字符串中; 这些更容易扫描多次。 如果你不允许这样做,你可以使用istream::tellg记住位置,向前扫描,一旦你决定, istream::seekg回到你开始的地方。 但我不知道你的导师强加了什么规则。

如果你不能寻求,你可以尝试手工黑客攻击。 首先读取一个int ,然后查看下一个字符。 如果它是'.' ,然后你可以读一个double,它会给你小数部分,你可以将它添加到你已读过的整数中。 如果它是'E''e' ,它会变得有点困难; 你可能需要前进,读取一个int,并手动使用pow 但这远非完美:如果双重形式为"1.2E6" ,那么你最终会得到200000作为“分数”部分; 你需要一些方法来检测它,并缩放你读过的整数。 如果数字为".3" ,则在读取整数时会出现错误:您可以事先检查(但不要忘记"-.3" ),或者在执行任何其他操作之前重置错误。 当然,双精度的整数部分可能不适合int (甚至long long )。

总而言之,对我来说似乎有点人为。 在实践中,您将读入一个字符串,并将正则表达式与其匹配,以确定您希望如何解释它。

它可能更容易在整行中作为字符串读取,检查小数点然后将该行提供给字符串流,然后可以将其转换为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;
}

根据你的规范,我会读取一个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";
        }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM