5

我整天都在努力寻找解决方案!您可能会将其标记为重新发布,但我真正想要的是不使用 boost lexical cast的解决方案。传统的 C++ 方法会很棒。我尝试了这段代码,但它返回了一组乱码数字和字母。

string line; 
double lineconverted;

istringstream buffer(line);
lineconverted;
buffer >> lineconverted;

我也试过这个,但它总是返回 0。

stringstream convert(line);
if ( !(convert >> lineconverted) ) {
    lineconverted  = 0;
}

提前致谢 :)

编辑:对于我使用的第一个解决方案(胡言乱语)..这是一个快照 在此处输入图像描述

4

3 回答 3

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介于两者之间。

还有一个更短的解决方案,您可以将值初始化为字符串流并同时将其刷新为双精度:

#include <sstream>
int main(int argc, char *argv[]){
   stringstream("3.1415")>>f ;
}
于 2013-05-25T08:54:01.613 回答
6

从 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;
}
于 2013-05-25T08:51:49.410 回答
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"));

}
于 2013-05-25T09:04:57.743 回答