13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||||||
1 | ||||||
Ошибка ввода float чисел01.07.2021, 20:48. Показов 2187. Ответов 25
Метки нет (Все метки)
Есть вот такой код.
v 439847.000000 422137.000000 79700.000000 А вот с такой проблем нет: v 439847 422137 79700 В винде все работает. Когда запускаю под отладчиком в линуксе тоже все работает, что удивительно. Я в инете не нашел, чтоб кто то жаловался. Означает ли это баг либы libstdc++ ? Если да, то лечить надо регуляркой ? И заодно хотел узнать, насколько уместны и безопасны все эти сишные функции в плюсовом коде ?
0
|
01.07.2021, 20:48 | |
Ответы с готовыми решениями:
25
опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing Ошибка преобразования float в float* Ошибка cannot convert 'float' to 'float*' Ошибка при окончании ввода чисел в вектор |
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
01.07.2021, 21:15 | 2 |
Сообщение было отмечено squareroot как решение
Решение
squareroot, локаль скорее всего стоит русская. Проверить просто - заменить точку на запятую. Вряд ли баг.
Зависит от особенностей вашего проекта. Абстрактно - ничего плохого в них нет, если использовать правильно.
1
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
01.07.2021, 21:26 [ТС] | 3 |
Вы были правы. Это невероятно даже о таком догадаться.
Первый минус я нашел - распознавание зависит от текущей локали. А какие еще сюрпризы мне ждать ? Там в основе вариативная функция, которая выглядит небезопасной и устаревшей с появлением вариативных шаблонов. Думаю std::getline + std::regex + конвертеры строка-число выиграют у sscanf по скорости, хотя надо мерить.
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
01.07.2021, 21:42 | 4 |
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||||||
01.07.2021, 22:06 [ТС] | 5 | |||||
Странно, но почему тогда выражение:
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
01.07.2021, 22:24 | 6 |
squareroot, это другое. В смысле у cout своя локаль, а scanf использует глобальную.
Добавлено через 2 минуты Очень вряд ли. Переубеждать тут вас никто не будет, не подходит, значит не подходит. Дело ваше же.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||||||
01.07.2021, 22:40 [ТС] | 7 | |||||
А жаль. Просто не хочется краснеть, если вдруг этот код придется показывать кому то.
Добавлено через 12 минут Если это глобальная локаль:
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
01.07.2021, 22:45 | 8 |
Ну вот из-за таких вот высказываний и не хочется совершено ни о чем дискутировать.
Это не глобальная локаль, а временный объект локали. Глобальная - это вот: https://en.cppreference.com/w/... ale/global
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
01.07.2021, 22:49 [ТС] | 9 |
Я смотрел эту функцию. Она нужна чтоб менять локаль, А не получать.
Так сказано в документации. А то что я привел, то там черным по белому написано:
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
01.07.2021, 22:52 | 10 |
Вот именно, вы сами-то прочитайте что там написано.
Создает копию глобальной локали. Копию! Еще раз, не создает глобальную локаль, а создает копию глобальной локали.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
01.07.2021, 22:54 [ТС] | 11 |
Ну Да, копию. Подлинную полную копию создает ведь ? А мне надо только узнать точка или запятая.
Кто по копии мне узнать мешает ?
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
01.07.2021, 22:57 | 12 |
Зачем ее получать-то? Чтобы повлиять на поведение функции, нужно наоборот ее задать.
Во-вторых, если вы уже читаете документацию, то там как бы четко написано, что в программе на С++ две локали, С и С++. Это разные вещи. Совпадать они начнут только после вызова функции global .Добавлено через 1 минуту Вы по копии С++ локали хотите узнать настройки локали С? Я такого сразу предположить не смог, извините.
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 |
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||||||
01.07.2021, 23:08 [ТС] | 15 | |||||
Готово:
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
02.07.2021, 14:24 [ТС] | 16 |
DrOffset, А может sscanf приводить к сбоям в работе при некорректной строке ?
Надо ли предварительно проверять строку регуляркой ? Добавлено через 5 минут Вот даже в инете есть коечто на этот счет: https://stackoverflow.com/ques... rogramming Добавлено через 22 минуты И Википедия тоже не молчит: Интересная ситуювина. А sscanf_s под линукс нету ? Добавлено через 7 минут макроопределение добавил #define __STDC_WANT_LIB_EXT1__ 1
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
02.07.2021, 15:31 | 17 |
Может.
Скорее надо использовать соответствующие форматные параметры, и(или) проверять размеры входящих строк. Пока нет.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
02.07.2021, 16:10 [ТС] | 18 |
Тут надо разделить ситуации.
1)Сбой из-за неверного типа переменной результата для данной распознаваемой строки и сбой из-за того что пришла некорректная строка для парсинга и эта некорректность безотносительна того какой тип параметра переменной результата ожидается. Грубо говоря, подали что то совсем нечитабельное(какой бинарный код например) и функция глюкнулась. Вы дали ответ только по первому случаю. Я нарыл либу libsafe_iop вроде она по этой теме " ISO TR24731 Bounds Checking Interface" Щас поковыряю ее и отпишусь.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
02.07.2021, 16:14 | 19 |
Это общая проблема, она не касается конкретно scanf. Scanf обрубит до первого нуля этот бинарный код, если это как строка подавалось и все. Вообще любой пользовательский ввод, если это важно, нужно защищать от такого.
Добавлено через 15 секунд А где 2) ?
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
02.07.2021, 16:20 [ТС] | 20 |
Вот я и хотел знать надо ли защищать. В данном случае скорее не пользовательский ввод, а процес чтения файла, где может появится чтото непотребное. И не будет ли лишней это ? Ведь sscanf тоже что то проверяет. А проверка регуляркой недешевая операция.
Это оно и есть.
0
|
02.07.2021, 16:20 | |
02.07.2021, 16:20 | |
Помогаю со студенческими работами здесь
20
ошибка "invalid operands to binary expression ('float*' and 'float')" Проверка на корректность ввода типа double и float ОШИБКА [Error] cannot convert 'int*' to 'float*' for argument '1' to 'void Syma(float*,int*,int) Ошибка при создании трех колонок (float:left, float:right и margin:0 auto;) Ошибка: invalid operands to binary * (have 'float *' and 'float *') Из ввода дана непустая последовательность из “n” вещественных чисел (n задается из ввода), за которой следует 0. Определить количество чисел Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |