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

Что если число будет слишком большим и не поместиться в int?

17.03.2014, 05:23. Показов 10775. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно есть char*, надо в int. Вроде есть atoi для этих целей. Но тут появляется пара неудобных вопросов:
1) Что если число будет слишком большим и не поместиться в инт?
2) Скорее теоретически, т.к. не цифры отсекаются при формировании входного char*, но тем не менее: что если в char* будут не только цифры?

Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2014, 05:23
Ответы с готовыми решениями:

Что будет если к пустой строке применить strtoint. Какое число будет присвоено?
Что будет если к пустой строке применить strtoint. Какое число будет присвоено?

Что произойдет, если число будет больше максимального допустимого данным типом?
Что произойдет если число, присвоенное целой переменной с/без знаком(а), будет больше максимального...

Что будет выведено на экран в результате работы программы, если введено число 20?
7. Что будет выведено на экран в результате работы программы, если введено число 20? Через mod(m,...

Что будет, если установленная ОЗУ будет от разных производителей?
Добрый вечер! На мамке 2 слота для оперативки. купил недавно 2 гб OCZ. И сегодня 1гб другой фирмы....

37
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 05:51 2
Ответы на поставленные вопросы:
Цитата Сообщение от DarkMasterW Посмотреть сообщение
1) Что если число будет слишком большим и не поместиться в инт?
Будет обрезано до максимально допустимого.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
что если в char* будут не только цифры?
Цитата Сообщение от DarkMasterW Посмотреть сообщение
не цифры отсекаются при формировании входного char*
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 06:34  [ТС] 3
Цитата Сообщение от alsav22 Посмотреть сообщение
Будет обрезано до максимально допустимого.
как не допустить? Обрезать по количеству символов, загнать в long, потом в int?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 06:40 4
Цитата Сообщение от DarkMasterW Посмотреть сообщение
как не допустить?
Как придумаете. Вариантов много.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Обрезать по количеству символов, загнать в long, потом в int?
Можно так, можно по-другому. Сами на свои вопросы отвечаете. Если хотите спросить: как лучше сделать, то без понятия, всё зависит от задач, условий и пр.
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 07:06  [ТС] 5
Спрашиваю потому, что не уверен в решении. Опыта ноль...
Суть задачи: в длл прилетает char*, в нем есть некоторый набор параметров для расчетов. Соответственно параметры надо перегнать в числовой тип. Надо сделать защиту от дурака. Контроль со стороны программы посылающей данные в длл невозможен.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 08:02 6
Цитата Сообщение от DarkMasterW Посмотреть сообщение
в нем есть некоторый набор параметров для расчетов
Как выглядит этот набор? Что из себя представляет (или может представлять)? Как распологается в строке (или это слово?)?
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Соответственно параметры надо перегнать в числовой тип.
Какого типа?
0
40 / 40 / 17
Регистрация: 04.02.2014
Сообщений: 144
17.03.2014, 08:10 7
Цитата Сообщение от DarkMasterW Посмотреть сообщение
как не допустить? Обрезать по количеству символов, загнать в long, потом в int?
Если заранее известно, что переменная не будет принимать отрицательных значений, можно сразу исключить диапазон чисел меньше 0. Допустим, таким образом: unsigned long long. Такая запись увеличит ячейку памяти до 64 бит и поместится число 264-1.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
17.03.2014, 08:29 8
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Собственно есть char*, надо в int. Вроде есть atoi для этих целей.
тогда есть atol или atof
http://devoid.com.ua/functions... -atol.html
Цитата Сообщение от DarkMasterW Посмотреть сообщение
что если в char* будут не только цифры?
Функция прекращает чтение исходной строки как только появится первый символ,
от туда же
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 09:01  [ТС] 9
Цитата Сообщение от alsav22 Посмотреть сообщение
Какого типа?
DWORD
Цитата Сообщение от alsav22 Посмотреть сообщение
Как выглядит этот набор? Что из себя представляет (или может представлять)? Как распологается в строке (или это слово?)?
[a-zA-Z0-9] [DWORD] [0-9] [0-9] [a-zA-Z0-9]
Примерно так. Может отсутствовать любое количество параметров начиная с конца, так же строка может иметь вид:
[a-zA-Z0-9] [a-zA-Z0-9]
Это корректный вид строки. Вся строка будет вбита ручками пользователем. Соответственно, что там прилетит никому не известно.
Начал читать подробнее про atoi - dword походу не его стезя. Или я ошибаюсь? Под unsigned нашел только strtoul, но он под long и strtoull под long long соответственно.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 10:14 10
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Под unsigned нашел только strtoul, но он под long
У меня DWORD и есть:
typedef unsigned long DWORD. А у вас?

Добавлено через 1 минуту
Цитата Сообщение от DarkMasterW Посмотреть сообщение
[a-zA-Z0-9] [DWORD] [0-9] [0-9] [a-zA-Z0-9]
Примерно так. Может отсутствовать любое количество параметров начиная с конца, так же строка может иметь вид:
[a-zA-Z0-9] [a-zA-Z0-9]
Для ясности, конкретные примеры строк привидите, и укажите, что из каждой нужно извлечь.
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 10:34  [ТС] 11
Цитата Сообщение от alsav22 Посмотреть сообщение
typedef unsigned long DWORD. А у вас?
К своему стыду много лет считал dword именно unsigned int, правда я и не писал... Честно говоря немного в шоке...
Цитата Сообщение от alsav22 Посмотреть сообщение
Для ясности, конкретные примеры строк привидите, и укажите, что из каждой нужно извлечь.
Оно все извлекается, так же есть все необходимые проверки кроме обсуждаемого значения. Примеры:
Sub9 268009 5 1 9 Point1
Sub9 268009
Sub9 Point1
VerL 12800 8 0 7 dis8toDis1
VerL 12800 8
Первое и последнее слово могут иметь численно-буквенное значение, символы в любом порядке могут идти.

Склоняюсь к strtoul и strtoull. Срезаем char* до такой длинны, чтобы точно влезло в long long и не влезло в long, дальше уже математикой проверяем и срезаем. Т.е. та же схема, о которой думал изначально.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 10:58 12
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Оно все извлекается
Оно это что?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
17.03.2014, 11:19 13
Цитата Сообщение от DarkMasterW Посмотреть сообщение
считал dword именно unsigned int,
DWORD это двойное слово 4 байта

а вот как оно реализовано в конкретном компиляторе, вопрос
для 16 битных это был long
для 32 битных это int
во многих 32 битных компиляторах long=int=4
а для 64бит(8 байт) уже используют long long, хотя говорят он не стандартный

для 64 битных компиляторов, размерности не знаю
1
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 11:31  [ТС] 14
Цитата Сообщение от alsav22 Посмотреть сообщение
Оно это что?
вся строка исправно парсится в свои переменные. Вопрос только по безопасности парсинга dword'у по сути.
Цитата Сообщение от ValeryS Посмотреть сообщение
для 32 битных это int
во многих 32 битных компиляторах long=int=4
Видимо поэтому так и считал. Как раз времена были когда про 16 уже совсем забыли, а о 64 еще не думали.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 11:34 15
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Вопрос только по безопасности парсинга dword'у по сути.
Разговор о втором слове в строке? Это имеется ввиду под dword?
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 11:39  [ТС] 16
да. хотя честно не совсем понимаю какая разница где оно находится...
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
17.03.2014, 11:44 17

Не по теме:

Вторая страница, а воз на месте...

Сформулируйте задачу точнее.
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 11:48  [ТС] 18
char* = "число"
необходимо конвертнуть
char* в dword
если число содержащееся в *char больше, чем помещается в dword, то вернуть ошибку.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.03.2014, 12:07 19
Цитата Сообщение от ValeryS Посмотреть сообщение
long long, хотя говорят он не стандартный
начиная с C++11 уже стандартный.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
если число содержащееся в *char больше, чем помещается в dword, то вернуть ошибку.
Т.к. dword это синоним (typedef) какого-то стандартного типа, можно выяснить через std::numetic_limits его предельные значения, и дальше разбирать посимвольно строку дабы диагностировать факт выхода из границ.
Хотя можно и стандартную strtol натравить, которая должна установить errno в ERANGE в случае выхода из диапазона.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 14:00 20
Цитата Сообщение от Tulosba Посмотреть сообщение
Хотя можно и стандартную strtol натравить, которая должна установить errno в ERANGE в случае выхода из диапазона.
По-моему, самое правильное, в данном случе (если понял, что, собственно, нужно).

DarkMasterW, как вот это:
Цитата Сообщение от DarkMasterW Посмотреть сообщение
если число содержащееся в *char больше, чем помещается в dword, то вернуть ошибку.
совмещается вот с этим?
Цитата Сообщение от DarkMasterW Посмотреть сообщение
как не допустить?
(это ответ на то, что если, при преобразовании char* в число, через функции типа atoi, получится число больше предельно допустимого, то оно будет автоматически обрезано до максимально допустимого).
Не допустить и допустить, но выдать ошибку - это совершенно разные задачи.
0
17.03.2014, 14:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2014, 14:00
Помогаю со студенческими работами здесь

Что будет выводить puts, если в конце строки не будет нулевого байта
что будет выводить puts, если в конце строки не будет нулевого байта

Что будет если СО будет двигаться навстречу свету?
Пусть у нас есть луч света, движущийся навстречу СО. И пусть СО тоже двигается прямолинейно со...

Теоретически! Если на сайте не будет не какой текстовой информации то и найти на нём что то будет не возможным (внутри)?
Вот чисто к примеру есть раскамнадзары и прочие ухари.... Вот как они ищут сайты !? Я к примеру...

Что делать с preloader-ом, если запрос произошёл слишком быстро?
Что делать с preloader-ом, если запрос произошёл слишком быстро? Ну, например, есть у меня корзина...

Подскажите что делать, если слишком долгая загрузка WIN 8.1 X64
Ну очень долгая загрузка наблюдается после переустановки ШINDOWS, я переустанавливался с WIN 7 X32...

что будет если отключить встроеный видеоадаптер через деспечер устройств если дескретной видеокарты нет?
что будет если отключить встроеный видеоадаптер через деспечер устройств если дескретной видеокарты...


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

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