2013-05-25 5 views
4

Я пытался найти решение для этого всего дня! Вы можете обозначить это как повторное сообщение, но то, что я действительно ищу, - это решение без использования лексического литологирования. Традиционный C++ способ сделать это был бы замечательным. Я пробовал этот код, но он возвращает набор чисел и букв тарабарщины.C++ Преобразование строки в двойную

string line; 
double lineconverted; 

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

И я ALSE попытался это, но он всегда возвращает 0.

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

Заранее спасибо :)

EDIT: Для первого решения я использовал (тарабарском) .. Вот снимок enter image description here

+0

"номера и буквы таблеток", все в двойной переменной? Как? –

+0

Что такое содержимое 'line'? –

+0

Двойное значение «50000» –

ответ

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; 
} 
+0

Я попробовал, он говорит: 'stod 'не является членом' std' –

+0

Вы уверены, что у вас включен C++ 11? – soon

+0

Я новичок в C++, просвещаю «как», пожалуйста :) –

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 между ними.

Существует также более короткий доступное решение, где вы можете инициализировать значение в stringstream и промойте его в двойной одновременно:

#include <sstream> 
int main(int argc, char *argv[]){ 
    stringstream("3.1415")>>f ; 
} 
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")); 

} 
Смежные вопросы