Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 11.03.2018
Сообщений: 115
1

Перевод строки в double с использованием stod

16.12.2020, 10:49. Показов 2462. Ответов 4

Author24 — интернет-сервис помощи студентам
Здравствуйте! Мне нужно из файла записать элементы в различные вектора и одно из побочных условий, которое возникает - перевод string в double. Я использую stod. Казалось, проблема решена, но не совсем. Мне нужно проверить, можно ли с помощью stod перевести элемент строкового вектора в double. Если вдруг он не может перевести, то тогда программа падает. Хотелось бы узнать - как можно проверить, можно ли с помощью stod перевести элемент вектора в double, если нет, то как-то обработать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2020, 10:49
Ответы с готовыми решениями:

Перевод строки в double или float
string cz = "1.1632"; Подскажите как правильно перевести?

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib> using namespace std;...

Заменить в строке все пробелы на перевод строки, а перевод строки изменить на два перевода
Меня интересует следующий вопрос: как заменить в моем стринге все пробелы на переходы на новую...

Перевод double to double
Всем привет! проблема такая : Есть вектор типа double. Из него надо считать число в переменную,...

4
фрилансер
5835 / 5355 / 1101
Регистрация: 11.10.2019
Сообщений: 14,317
16.12.2020, 10:59 2
Tretlenz, если стандарт C++17, то можно воспользоваться std::from_chars

плюсы (жирнющие такие): не кидает исключений
минусы: чуть менее удобно
0
Just Do It!
4012 / 2396 / 639
Регистрация: 23.09.2014
Сообщений: 7,682
Записей в блоге: 2
16.12.2020, 12:17 3
Цитата Сообщение от Tretlenz Посмотреть сообщение
то как-то обработать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>
#include <vector>
 
int main()
{   
    std::vector<double> result;
    std::string  s("@@@234.234,11.22XXX, zzz_111.33_ZZZ");
    std::cout << s << "\n\n";
    
    for(size_t i = 0; i < s.size();)
    {   
        try
        {   std::string::size_type sz = 0;
            double d = std::stod(&s[i], &sz);
            result.push_back(d);
            i += sz;
        }
        catch(...)
        {   ++i;
        }
    }
    
    for(const auto e : result) std::cout << e << '\n';
}
1
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
16.12.2020, 12:34 4
https://www.cplusplus.com/reference/string/stod/

If no conversion could be performed, an invalid_argument exception is thrown.
If the value read is out of the range of representable values by a double (in some library implementations, this includes underflows), an out_of_range exception is thrown.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <exception>
 
int main()
{
  std::string sd1("365.24 29.53");
  std::string sd2("o365.o24 o29.o53");
  std::string::size_type sz;     // alias of size_t
  try
  {
    double earth = std::stod (sd2,&sz);
    double moon = std::stod (sd2.substr(sz));
  }
  catch(std::invalid_argument & e)
  {
     std::cout<<"error Invalid Argument : "<<e.what();
  }
  catch(std::out_of_range & e)
  { std::cout<<"error Out of Range : "<<e.what();}
   
 
  return 0;
}
Добавлено через 10 минут
std::string sd2("999999e+99999 29.53");
// исключение out_of_range
если без разницы тип исключения, тогда catch(...) как у XLAT,
1
Just Do It!
4012 / 2396 / 639
Регистрация: 23.09.2014
Сообщений: 7,682
Записей в блоге: 2
16.12.2020, 13:20 5
сишный вариант без исключений:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib> /// strtod
 
int main()
{   
    std::vector<double> result;
    std::string  s("@@@234.234,11.22XXX, zzz_111.33_ZZZ\n\n");
    std::cout << s;
    
    char* end = s.data() + s.size();
    
    for(char*  i  = s.data(); i < end; ++i)
    {   char*  e  = i;
        double d  = strtod (i, &i);
        if(e != i)  result.push_back(d);
    }
    
    for(const auto e : result) std::cout << e << '\n';
}
0
16.12.2020, 13:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2020, 13:20
Помогаю со студенческими работами здесь

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)"
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double...

Разбиение строки на части, перевод строки в число и перевод числа
Есть задание: 1. Необходимо реализовать консольное приложение, позволяющее манипулировать строкой,...

Использование функции stod в методе класса
Добрый день! Возникла проблема с функцией stod. Если я ее прописываю в мейне, работает, как...

Std::stod отсекает дробную часть
В файлике имеется текст с чиселками как целыми, так и нет. Вся соль в том, что std::stod почему-то...

Перевод в строку из Double
необходимо перевести в строку число, находящееся в переменной типа Double Переменная - это поле...

Перевод double в byte[]
Я нашел такой код. double d = 65.43; byte output = new byte; long lng =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru