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

Ошибка ввода float чисел

01.07.2021, 20:48. Показов 2187. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть вот такой код.
C++ (Qt)
1
2
          
  int result = sscanf(line.c_str(), "v %lf %lf %lf", &v.p.x, &v.p.y, &v.p.z);
Вот такую строку не распознает (под Линукс)
v 439847.000000 422137.000000 79700.000000
А вот с такой проблем нет:
v 439847 422137 79700
В винде все работает. Когда запускаю под отладчиком в линуксе тоже все работает, что удивительно.
Я в инете не нашел, чтоб кто то жаловался. Означает ли это баг либы libstdc++ ?
Если да, то лечить надо регуляркой ?

И заодно хотел узнать, насколько уместны и безопасны все эти сишные функции в плюсовом коде ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2021, 20:48
Ответы с готовыми решениями:

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include<stdio.h> #include<stdlib.h> #include<math.h> float f1(float x)/*vira*enie 1*/ ...

Ошибка преобразования float в float*
Выдает ошибку невозможности преобразование /main.cpp/ #include <iostream> #include "gkh.h" int...

Ошибка cannot convert 'float' to 'float*'
Здравствуйте, что означает error: cannot convert 'float' to 'float*' for argument '1' to 'int...

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

25
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
01.07.2021, 21:15 2
Лучший ответ Сообщение было отмечено squareroot как решение

Решение

squareroot, локаль скорее всего стоит русская. Проверить просто - заменить точку на запятую. Вряд ли баг.

Цитата Сообщение от squareroot Посмотреть сообщение
насколько уместны и безопасны все эти сишные функции в плюсовом коде ?
Зависит от особенностей вашего проекта.
Абстрактно - ничего плохого в них нет, если использовать правильно.
1
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
01.07.2021, 21:26  [ТС] 3
Цитата Сообщение от DrOffset Посмотреть сообщение
squareroot, локаль скорее всего стоит русская. Проверить просто - заменить точку на запятую. Вряд ли баг.
Вы были правы. Это невероятно даже о таком догадаться.

Цитата Сообщение от DrOffset Посмотреть сообщение
Зависит от особенностей вашего проекта.
Абстрактно - ничего плохого в них нет, если использовать правильно.
Первый минус я нашел - распознавание зависит от текущей локали.
А какие еще сюрпризы мне ждать ?
Там в основе вариативная функция, которая выглядит небезопасной и устаревшей с появлением вариативных шаблонов.
Думаю std::getline + std::regex + конвертеры строка-число выиграют у sscanf по скорости, хотя надо мерить.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
01.07.2021, 21:42 4
Цитата Сообщение от squareroot Посмотреть сообщение
Первый минус я нашел - распознавание зависит от текущей локали.
Это не минус. Локаль для этого и предназначена.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
01.07.2021, 22:06  [ТС] 5
Странно, но почему тогда выражение:

C++ (Qt)
1
2
3
    const char point =
            std::use_facet< std::numpunct<char> >
            (std::cout.getloc()).decimal_point();
возвращает точку, а не запятую ?
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
01.07.2021, 22:24 6
squareroot, это другое. В смысле у cout своя локаль, а scanf использует глобальную.

Добавлено через 2 минуты
Цитата Сообщение от squareroot Посмотреть сообщение
Думаю std::getline + std::regex + конвертеры строка-число выиграют у sscanf по скорости
Очень вряд ли.

Цитата Сообщение от squareroot Посмотреть сообщение
Там в основе вариативная функция, которая выглядит небезопасной и устаревшей с появлением вариативных шаблонов.
Переубеждать тут вас никто не будет, не подходит, значит не подходит. Дело ваше же.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
01.07.2021, 22:40  [ТС] 7
Цитата Сообщение от DrOffset Посмотреть сообщение
Переубеждать тут вас никто не будет, не подходит, значит не подходит. Дело ваше же.
А жаль. Просто не хочется краснеть, если вдруг этот код придется показывать кому то.

Добавлено через 12 минут
Если это глобальная локаль:
C++ (Qt)
1
2
3
    const char point =
            std::use_facet< std::numpunct<char> >
            (std::locale()).decimal_point();
то тоже мимо.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
01.07.2021, 22:45 8
Цитата Сообщение от squareroot Посмотреть сообщение
то тоже мимо
Ну вот из-за таких вот высказываний и не хочется совершено ни о чем дискутировать.

Это не глобальная локаль, а временный объект локали.

Глобальная - это вот:
https://en.cppreference.com/w/... ale/global
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
01.07.2021, 22:49  [ТС] 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну вот из-за таких вот высказываний и не хочется совершено ни о чем дискутировать.

Это не глобальная локаль, а временный объект локали.

Глобальная - это вот:
https://en.cppreference.com/w/... ale/global
Я смотрел эту функцию. Она нужна чтоб менять локаль, А не получать.
Так сказано в документации.
А то что я привел, то там черным по белому написано:
Default constructor. Constructs a copy of the global C++ locale
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
01.07.2021, 22:52 10
Цитата Сообщение от squareroot Посмотреть сообщение
А то что я привел, то там черным по белому написано
Вот именно, вы сами-то прочитайте что там написано.

Создает копию глобальной локали. Копию!
Еще раз, не создает глобальную локаль, а создает копию глобальной локали.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
01.07.2021, 22:54  [ТС] 11
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот именно, вы сами-то прочитайте что там написано.

Создает копию глобальной локали. Копию!
Еще раз, не создает глобальную локаль, а создает копию глобальной локали.
Ну Да, копию. Подлинную полную копию создает ведь ? А мне надо только узнать точка или запятая.
Кто по копии мне узнать мешает ?
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
01.07.2021, 22:57 12
Цитата Сообщение от squareroot Посмотреть сообщение
А не получать.
Зачем ее получать-то? Чтобы повлиять на поведение функции, нужно наоборот ее задать.

Во-вторых, если вы уже читаете документацию, то там как бы четко написано, что в программе на С++ две локали, С и С++. Это разные вещи. Совпадать они начнут только после вызова функции global.

Добавлено через 1 минуту
Цитата Сообщение от squareroot Посмотреть сообщение
Кто по копии мне узнать мешает ?
Вы по копии С++ локали хотите узнать настройки локали С? Я такого сразу предположить не смог, извините.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
01.07.2021, 23:02  [ТС] 13
DrOffset, Ой, ну и заморочек с этой локалью. Ок. Буду искать как вытащить запятую/точку из Си локали.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
01.07.2021, 23:05 14
Цитата Сообщение от squareroot Посмотреть сообщение
Буду искать как вытащить запятую/точку из Си локали.
https://en.cppreference.com/w/cpp/locale/lconv
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
01.07.2021, 23:08  [ТС] 15
Готово:
C++ (Qt)
1
const char point = localeconv()->decimal_point;
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
02.07.2021, 14:24  [ТС] 16
DrOffset, А может sscanf приводить к сбоям в работе при некорректной строке ?
Надо ли предварительно проверять строку регуляркой ?

Добавлено через 5 минут
Вот даже в инете есть коечто на этот счет:
https://stackoverflow.com/ques... rogramming

Добавлено через 22 минуты
И Википедия тоже не молчит:

scanf is vulnerable to format string attacks. Great care should be taken to ensure that the formatting string includes limitations for string and array sizes. In most cases the input string size from a user is arbitrary and cannot be determined before the scanf function is executed. This means that uses of %s placeholders without length specifiers are inherently insecure and exploitable for buffer overflows. Another potential problem is to allow dynamic formatting strings, for example formatting strings stored in configuration files or other user-controlled files. In this case the allowed input length of string sizes cannot be specified unless the formatting string is checked beforehand and limitations are enforced. Related to this are additional or mismatched formatting placeholders which do not match the actual vararg list. These placeholders might be partially extracted from the stack or contain undesirable or even insecure pointers, depending on the particular implementation of varargs.
Добавлено через 5 часов 24 минуты
Интересная ситуювина.
А sscanf_s под линукс нету ?

Добавлено через 7 минут
макроопределение добавил
#define __STDC_WANT_LIB_EXT1__ 1
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
02.07.2021, 15:31 17
Цитата Сообщение от squareroot Посмотреть сообщение
А может sscanf приводить к сбоям в работе при некорректной строке ?
Может.

Цитата Сообщение от squareroot Посмотреть сообщение
Надо ли предварительно проверять строку регуляркой ?
Скорее надо использовать соответствующие форматные параметры, и(или) проверять размеры входящих строк.

Цитата Сообщение от squareroot Посмотреть сообщение
А sscanf_s под линукс нету ?
Пока нет.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
02.07.2021, 16:10  [ТС] 18
Цитата Сообщение от DrOffset Посмотреть сообщение
Может.
Скорее надо использовать соответствующие форматные параметры, и(или) проверять размеры входящих строк.
Тут надо разделить ситуации.
1)Сбой из-за неверного типа переменной результата для данной распознаваемой строки и сбой из-за того что пришла некорректная строка для парсинга и эта некорректность безотносительна
того какой тип параметра переменной результата ожидается. Грубо говоря, подали что то совсем нечитабельное(какой бинарный код например) и функция глюкнулась.
Вы дали ответ только по первому случаю.

Цитата Сообщение от DrOffset Посмотреть сообщение
Пока нет.
Я нарыл либу libsafe_iop вроде она по этой теме " ISO TR24731 Bounds Checking Interface"
Щас поковыряю ее и отпишусь.
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
02.07.2021, 16:14 19
Цитата Сообщение от squareroot Посмотреть сообщение
. Грубо говоря, подали что то совсем нечитабельное(какой бинарный код например)
Это общая проблема, она не касается конкретно scanf. Scanf обрубит до первого нуля этот бинарный код, если это как строка подавалось и все. Вообще любой пользовательский ввод, если это важно, нужно защищать от такого.

Добавлено через 15 секунд
Цитата Сообщение от squareroot Посмотреть сообщение
1)
А где 2) ?
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
02.07.2021, 16:20  [ТС] 20
Цитата Сообщение от DrOffset Посмотреть сообщение
Это общая проблема, она не касается конкретно scanf. Scanf обрубит до первого нуля этот бинарный код, если это как строка подавалось и все. Вообще любой пользовательский ввод, если это важно, нужно защищать от такого.
Вот я и хотел знать надо ли защищать. В данном случае скорее не пользовательский ввод, а процес чтения файла, где может появится чтото непотребное. И не будет ли лишней это ? Ведь sscanf тоже что то проверяет. А проверка регуляркой недешевая операция.

Цитата Сообщение от DrOffset Посмотреть сообщение
Добавлено через 15 секунд

А где 2) ?
Это оно и есть.
0
02.07.2021, 16:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2021, 16:20
Помогаю со студенческими работами здесь

ошибка "invalid operands to binary expression ('float*' and 'float')"
начала писать программу и запоролась на первой же функции double atmosphere(double h_geo) { ...

Проверка на корректность ввода типа double и float
Как сделать, чтобы выводила ошибку при некорректном вводе?

ОШИБКА [Error] cannot convert 'int*' to 'float*' for argument '1' to 'void Syma(float*,int*,int)
Какая то проблема с указателями,незнаю,не хочет щитать суму парних чисел в второй...

Ошибка при создании трех колонок (float:left, float:right и margin:0 auto;)
3-й час бьюсь, но никак не могу понять, что не так делаю. почему оранжевый блок опускается? ...

Ошибка: invalid operands to binary * (have 'float *' and 'float *')
Возникла проблема c несоответствием типов данных. Код: #include &lt;stdio.h&gt; #include...

Из ввода дана непустая последовательность из “n” вещественных чисел (n задается из ввода), за которой следует 0. Определить количество чисел
13. Из ввода дана непустая последовательность из “n” вещественных чисел (n задается из ввода), за...


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

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