С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 29.10.2020
Сообщений: 70

функция stof (перевод строки во float)

27.10.2021, 15:11. Показов 5331. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не совсем понимаю как работает функция stof. почему-то если делать не через char ,а через wchar_t то все работает. Можете исправить ошибку?

C++
1
2
3
4
5
6
7
8
9
   char* pCurrent = pStr;  //pStr это указатель на строку
    while (pCurrent[0])
    {
        ch = pCurrent[0];
        if (ch >= '1' && ch <= '9')
        {
            ans = stof(pCurrent, &pCurrent);   //здесь ошибка в stof
        }
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.10.2021, 15:11
Ответы с готовыми решениями:

Stof преобразует в int вместо float
Нужно прочитать файл с последовательностью дробных чисел и преобразовать его в массив дробных чисел. #include &lt;iostream&gt; ...

Перевод строки, содержащей число типа float, в число float
Помогите разобраться, как строку, к примеру &quot;0.123&quot; перевести в переменную типа float...

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

18
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,558
27.10.2021, 15:29
А зачем вторым параметром передаётся указатель на указатель на строку?
0
1 / 1 / 0
Регистрация: 29.10.2020
Сообщений: 70
27.10.2021, 20:40  [ТС]
John Prick, я такой метод подсмотрел в решении задачи,но ничего не понял.Поэтому здесь и написал.Как тогда со строки сосчитать все числа?
0
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,558
27.10.2021, 20:53
junior_student, для начала заглянуть в документацию: https://ru.cppreference.com/w/... tring/stof
C++
1
2
3
float       stof( const std::string& str, size_t *pos = 0 );
double      stod( const std::string& str, size_t *pos = 0 );
long double stold( const std::string& str, size_t *pos = 0 );
Извлекает число с плавающей точкой из строки str.

Функция отбрасывает пробельные символы (определяемые с помощью std::isspace()), пока не будет найден первый непробельный символ. Затем из строки извлекаются символы, необходимые для формирования корректного представления числа с плавающей точкой и преобразуются в непосредственное значение данного числа.

<...>

Параметры
str — строка для преобразования
pos — адрес переменной целочисленного типа для сохранения в ней индекса первого непреобразованного символа
Соответственно, если надо преобразовать одно число, встретившееся в строке, достаточно просто вызвать ans = stof(pCurrent);. Если же надо
Цитата Сообщение от junior_student Посмотреть сообщение
со строки сосчитать все числа
, то придётся как-то вычленять из текста подстроки с числами и вызывать stofдля каждой. Для обхода строки как раз может помочь второй параметр, в котором будет возвращено количество символов преобразованной в число строки:
C++
1
2
3
4
5
6
const char * text = "2 по 100";
char * str = text;
int count;
float ans = stof(str, &count);
str += count;
// .. от этой позиции ищем следующее число в строке.
1
1 / 1 / 0
Регистрация: 29.10.2020
Сообщений: 70
27.10.2021, 21:13  [ТС]
John Prick,
Миниатюры
функция stof (перевод строки во float)  
0
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,558
27.10.2021, 21:15
Попробуй size_t count;
1
1 / 1 / 0
Регистрация: 29.10.2020
Сообщений: 70
27.10.2021, 21:20  [ТС]
John Prick, с size_t работает,спасибо,вы очень помогли.А чем вообще size_t отличается от Int? почему в данном случае int не подошел
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
27.10.2021, 21:23
Цитата Сообщение от junior_student Посмотреть сообщение
я такой метод подсмотрел в решении задачи,но ничего не понял.
Сомневаюсь. Нигде вы такого "подсмотреть" не могли. В любом случае, написана чушь.

Добавлено через 1 минуту
Цитата Сообщение от John Prick Посмотреть сообщение
Попробуй size_t count;
Что значит "попробуй"??? С чего это вдруг в изначальном варианте вы использовали int, когда в процитированной вами же документации ясно написано size_t? Просто "попробовать"?
0
1 / 1 / 0
Регистрация: 29.10.2020
Сообщений: 70
27.10.2021, 21:24  [ТС]
TheCalligrapher, https://github.com/ilyachalov/... ercise.cpp
начиная со 136 строки.Есть еще вариант,что может я не так что понял...Можете посмотреть?
0
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,558
27.10.2021, 21:26
Цитата Сообщение от junior_student Посмотреть сообщение
А чем вообще size_t отличается от Int? почему в данном случае int не подошел
size_t - беззнаковый тип. На MSVC 2013 size_t это unsigned int. Просто у вас компилятор настроен так, что считает такое несоответствие ошибкой. В другом случае мог выдать только предупреждение или вообще пропустить это.

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
С чего это вдруг в изначальном варианте вы использовали int, когда в процитированной вами же документации ясно написано size_t?
Каюсь, сам же и недосмотрел.
0
1 / 1 / 0
Регистрация: 29.10.2020
Сообщений: 70
27.10.2021, 21:27  [ТС]
John Prick, спасибо! кратко и понятно
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
27.10.2021, 21:31
Цитата Сообщение от junior_student Посмотреть сообщение
начиная со 136 строки.
Но там для перевода вызывается функция wcstof. У вас же вызывается функция std::stof. Это совершенно разные функции.

Почему вы решили, что можно просто подменить wcstof на std::stof?

Добавлено через 1 минуту
Цитата Сообщение от John Prick Посмотреть сообщение
На MSVC 2013 size_t это unsigned int.
С чего бы это вдруг? unsigned int в MSVC - всегда 32-битный тип. Но в 64-битных конфигурациях MSVC size_t является 64-битным типом. То есть size_t никак не может быть unsigned int.

Цитата Сообщение от John Prick Посмотреть сообщение
Просто у вас компилятор настроен так, что считает такое несоответствие ошибкой.
Сами языки С и С++ считают такое несоответствие жесткой ошибкой. Любой компилятор С и С++ всегда считает это ошибкой. Иначе он не признается компилятором С или С++. Без вариантов.
0
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,558
27.10.2021, 21:32
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
С чего бы это вдруг?
Хорошо, на моём MSVC, который у меня сейчас под рукой.
0
1 / 1 / 0
Регистрация: 29.10.2020
Сообщений: 70
27.10.2021, 21:34  [ТС]
TheCalligrapher, я даже и не знаю я занимаюсь по книге лафоре и такие моменты еще не рассматривались.Я пробовал самостоятельно читать про char16_t, char32_t, wchar_t и единственное что понял,так это какой-то расширенный набор символов.Вот на github решение сделано через wchar_t и поэтому используется функция wcstof. А я пока что использую обычный char
0
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,558
27.10.2021, 21:36
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Сами языки С и С++ считают такое несоответствие жесткой ошибкой. Любой компилятор С и С++ всегда считает это ошибкой. Иначе он не признается компилятором С или С++. Без вариантов.
Не вдавался в эти подробности. Встречались мне компиляторы, которые просто выдавали предупреждение.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
27.10.2021, 21:42
Цитата Сообщение от junior_student Посмотреть сообщение
Я пробовал самостоятельно читать про char16_t, char32_t, wchar_t и единственное что понял,так это какой-то расширенный набор символов.Вот на github решение сделано через wchar_t и поэтому используется функция wcstof. А я пока что использую обычный char
В коде по ссылке используется С-шная функция wcstof, которая является "широким" аналогом С-шной функции strtof. Если вы хотели перевести тот код на работу с обычными символами char, вам нужно было бы заменить wcstof на strtof. И все бы прекрасно работало.

А вы вместо этого почему-то заменили ее на С++-ную функцию std::stof. Это совсем другая функция с совсем другими параметрами.

Добавлено через 2 минуты
Цитата Сообщение от John Prick Посмотреть сообщение
Не вдавался в эти подробности. Встречались мне компиляторы, которые просто выдавали предупреждение.
Нет. Эти компиляторы выдавали именно ошибку. А то, что в этой ошибке содержалось слово "warning" никакого значения не имеет. Текст диагностических сообщений не стандартизован - там можно писать что угодно.

В мире С и С++ не существует понятия "предупреждения" вообще. Все стандартные диагностические сообщения являются сообщениями об ошибках. Без вариантов.
1
1 / 1 / 0
Регистрация: 29.10.2020
Сообщений: 70
27.10.2021, 21:44  [ТС]
TheCalligrapher, ух ты ж,Спасибо,теперь уже знаю
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
27.10.2021, 21:44
Цитата Сообщение от John Prick Посмотреть сообщение
Хорошо, на моём MSVC, который у меня сейчас под рукой.
"на моём MSVC, который у меня сейчас под рукой, в той конфигурации, которая у меня сейчас кликнута мышкой"

Возьмите ваш "MSVC, который у вас сейчас под рукой" и переключите конфигурацию проекта на x64. Посмотрите на size_t.
0
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,558
27.10.2021, 21:48
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Возьмите ваш "MSVC, который у вас сейчас под рукой" и переключите конфигурацию проекта на x64. Посмотрите на size_t.
Хорошо, посмотрю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.10.2021, 21:48
Помогаю со студенческими работами здесь

Функция atof - превод строки в float тип
Проблема такая: получаю по СОМ порту строчку типа '-123.345' ее нужно перевести в float тиа. Использую функцию atof. Компилируется и...

Функция fgets и перевод строки
Есть файл со строками, надо прочитать все через функцию fgets. Как сделать, чтобы она читала каждую строку по очереди? Проблема на...

Перевод Int/FLoat -> QByteArray -> Int/Float
Есть задача переводить float/int данные в бинарный вид и обратно (в последующем для передачи по сети или записи в бинарные файлы, формат...

Ошибка std::stof()
Добрый день/утро/вечер/ночь! Пишу приложение на С++ с ипользованием OpenGL и FreeGLUT, открывающее *.obj файлы. Почитал специализацию...

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru