我需要将std::cin
的用户输入提取到double
类型的变量中。这是在复数的上下文中,因此通常会将数字输入设为5i
或5.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
?
答案 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;
}
}
首先,将每个空格分隔的字符串读入str
。 strtod
函数将尝试获得与字符一样多的数字以形成浮点文字,包括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')这样的条件。