我一直在努力寻找这一天的解决方案!您可能会将此标记为重新发布,但我真正想要的是解决方案而不使用提升词法。传统的C ++方式很棒。我尝试了这段代码,但它返回了一组乱码数字和字母。
string line;
double lineconverted;
istringstream buffer(line);
lineconverted;
buffer >> lineconverted;
我也试过这个,但它总是返回0。
stringstream convert(line);
if ( !(convert >> lineconverted) ) {
lineconverted = 0;
}
提前致谢:)
编辑:对于我使用的第一个解决方案(乱码)..这是一个快照
答案 0 :(得分:12)
#include <sstream>
int main(int argc, char *argv[])
{
double f = 0.0;
std::stringstream ss;
std::string s = "3.1415";
ss << s;
ss >> f;
cout << f;
}
好处是,这个解决方案也适用于其他人,比如整数等。
如果要重复使用相同的缓冲区,则必须在中间执行ss.clear
。
还有一个更短的解决方案,您可以将值初始化为字符串流并同时将其刷新为double:
#include <sstream>
int main(int argc, char *argv[]){
stringstream("3.1415")>>f ;
}
答案 1 :(得分:4)
从C ++ 11开始,您可以使用std::stod
函数:
string line;
double lineconverted;
try
{
lineconverted = std::stod(line);
}
catch(std::invalid_argument)
{
// can't convert
}
但是std::stringstream
的解决方案也是正确的:
#include <sstream>
#include <string>
#include <iostream>
int main()
{
std::string str;
std::cin >> str;
std::istringstream iss(str);
double d = 0;
iss >> d;
std::cout << d << std::endl;
return 0;
}
答案 2 :(得分:0)
如果你想存储(例如一个矢量)一行的所有双打
#include <iostream>
#include <vector>
#include <iterator>
int main()
{
std::istream_iterator<double> in(std::cin);
std::istream_iterator<double> eof;
std::vector<double> m(in,eof);
//print
std::copy(m.begin(),m.end(),std::ostream_iterator<double>(std::cout,"\n"));
}