带有尾随字符的C ++中的数字输入

时间:2016-12-07 12:57:39

标签: c++ double cin

我需要将std::cin的用户输入提取到double类型的变量中。这是在复数的上下文中,因此通常会将数字输入设为5i5.4565i

考虑main()函数中的以下代码:

while (true) {
    double c;
    std::cin >> c;
    std::cout << c << "\n\n";
}

以下是发生的事情:

In: 0.45
Out: 0.45
// OK

In: 5 0.45
Out: 5

0.45
// OK

In: 0.45i
Expected out: 0.45
Acutal out: 0

0

0...

我猜这是因为它没有将0.45i识别为double。那么如何从0.45正确获取值0.45i,忽略尾随i

4 个答案:

答案 0 :(得分:4)

首先读取一个字符串,然后转换为double,

$ cat ans.cpp 
#include <cstdlib>
#include <iostream>

int main()
{
    std::string str;
    double dbl;
    while (std::cin >> str) {
        dbl = std::strtod(str.data(), NULL);
        std::cout << dbl << std::endl;
    }
}

首先,将每个空格分隔的字符串读入strstrtod函数将尝试获得与字符一样多的数字以形成浮点文字,包括hex float。它返回从字符串的这一部分解析的double。第二个参数可以是char *指针,指向一个传递最后解析的字符。如果您不想简单地丢弃尾随字符,这将非常有用。如果它为null,则忽略它。

答案 1 :(得分:2)

您可以测试输入字符串的状态。如果输入失败,只需在字符串中获取有问题的令牌并继续。例如:

double d;

for(;;) {
    std::string dummy;
    std::cout << "Input :";
    std::cin >> d;
    if (std::cin.fail()) {          // was input numeric?
        std::cin.clear();
        std::cin >> dummy;
        if (dummy == "END") break;  // out of the infinite loop...
        std::cout << "Non numeric: >" << dummy << "<" << std::endl;

    }
    else {
        std::cout << "Numeric: " << d << std::endl;
    }
}

答案 2 :(得分:0)

尝试阅读std::string,然后手动解析。

答案 3 :(得分:0)

一种方法是将输入作为字符串,然后使用for循环逐个字符地分析它。然后将它转换为double而忽略i。你可以将字符串分成三个部分,即整数部分,小数部分和i。

为了分离这些,你可以使用像if(c [i] =='。')和if(c [i] =='i')这样的条件。