5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
|
|
1 | |
Что если число будет слишком большим и не поместиться в int?17.03.2014, 05:23. Показов 10775. Ответов 37
Метки нет (Все метки)
Собственно есть char*, надо в int. Вроде есть atoi для этих целей. Но тут появляется пара неудобных вопросов:
1) Что если число будет слишком большим и не поместиться в инт? 2) Скорее теоретически, т.к. не цифры отсекаются при формировании входного char*, но тем не менее: что если в char* будут не только цифры? Спасибо.
0
|
17.03.2014, 05:23 | |
Ответы с готовыми решениями:
37
Что будет если к пустой строке применить strtoint. Какое число будет присвоено? Что произойдет, если число будет больше максимального допустимого данным типом? Что будет выведено на экран в результате работы программы, если введено число 20? Что будет, если установленная ОЗУ будет от разных производителей? |
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
|
|
17.03.2014, 06:34 [ТС] | 3 |
как не допустить? Обрезать по количеству символов, загнать в long, потом в int?
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
17.03.2014, 06:40 | 4 |
Как придумаете. Вариантов много.
Можно так, можно по-другому. Сами на свои вопросы отвечаете. Если хотите спросить: как лучше сделать, то без понятия, всё зависит от задач, условий и пр.
0
|
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
|
|
17.03.2014, 07:06 [ТС] | 5 |
Спрашиваю потому, что не уверен в решении. Опыта ноль...
Суть задачи: в длл прилетает char*, в нем есть некоторый набор параметров для расчетов. Соответственно параметры надо перегнать в числовой тип. Надо сделать защиту от дурака. Контроль со стороны программы посылающей данные в длл невозможен.
0
|
40 / 40 / 17
Регистрация: 04.02.2014
Сообщений: 144
|
|
17.03.2014, 08:10 | 7 |
Если заранее известно, что переменная не будет принимать отрицательных значений, можно сразу исключить диапазон чисел меньше 0. Допустим, таким образом: unsigned long long. Такая запись увеличит ячейку памяти до 64 бит и поместится число 264-1.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
17.03.2014, 08:29 | 8 |
0
|
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
|
|
17.03.2014, 09:01 [ТС] | 9 |
DWORD
[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 |
У меня DWORD и есть:
typedef unsigned long DWORD. А у вас? Добавлено через 1 минуту Для ясности, конкретные примеры строк привидите, и укажите, что из каждой нужно извлечь.
0
|
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
|
|
17.03.2014, 10:34 [ТС] | 11 |
К своему стыду много лет считал dword именно unsigned int, правда я и не писал... Честно говоря немного в шоке...
Оно все извлекается, так же есть все необходимые проверки кроме обсуждаемого значения. Примеры: 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
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
17.03.2014, 11:19 | 13 |
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 |
вся строка исправно парсится в свои переменные. Вопрос только по безопасности парсинга dword'у по сути.
Видимо поэтому так и считал. Как раз времена были когда про 16 уже совсем забыли, а о 64 еще не думали.
0
|
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
|
|
17.03.2014, 11:39 [ТС] | 16 |
да. хотя честно не совсем понимаю какая разница где оно находится...
0
|
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 |
начиная с C++11 уже стандартный.
Т.к. dword это синоним (typedef) какого-то стандартного типа, можно выяснить через std::numetic_limits его предельные значения, и дальше разбирать посимвольно строку дабы диагностировать факт выхода из границ.
Хотя можно и стандартную strtol натравить, которая должна установить errno в ERANGE в случае выхода из диапазона.
1
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
17.03.2014, 14:00 | 20 |
По-моему, самое правильное, в данном случе (если понял, что, собственно, нужно).
DarkMasterW, как вот это: совмещается вот с этим? (это ответ на то, что если, при преобразовании char* в число, через функции типа atoi, получится число больше предельно допустимого, то оно будет автоматически обрезано до максимально допустимого). Не допустить и допустить, но выдать ошибку - это совершенно разные задачи.
0
|
17.03.2014, 14:00 | |
17.03.2014, 14:00 | |
Помогаю со студенческими работами здесь
20
Что будет выводить puts, если в конце строки не будет нулевого байта Что будет если СО будет двигаться навстречу свету? Теоретически! Если на сайте не будет не какой текстовой информации то и найти на нём что то будет не возможным (внутри)? Что делать с preloader-ом, если запрос произошёл слишком быстро? Подскажите что делать, если слишком долгая загрузка WIN 8.1 X64 что будет если отключить встроеный видеоадаптер через деспечер устройств если дескретной видеокарты нет? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |