Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/10: Рейтинг темы: голосов - 10, средняя оценка - 4.50
DarkMasterW
4 / 4 / 1
Регистрация: 25.10.2013
Сообщений: 230
1

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

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

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

Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2014, 05:23
Ответы с готовыми решениями:

Если первое число окажется кратным 5 или второе число будет нечетным, то вывести на экран сумму их модулей
4. Даны два числа N и М. Если первое число окажется кратным 5 или второе число...

Как в выделенную память записать поочередно число int, массив char[n], и еще число int
Выделяю память void* Start=malloc(Size); Как туда записать поочередно...

Что означает ошибка too few arguments to function ‘int my_func(int, int)’ (язык C++)?
В чём проблема? #include <iostream> int my_func (int i, int j){ int z; ...

Что будет если так сделать?
Всем привет! Что будет если применить такую конструкцию int global; void...

Как получить число типа int, если имеется указатель на строку с этим числом?
допустим у меня есть строка " 45"; и указатель на нее string *str; как...

37
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 05:51 2
Ответы на поставленные вопросы:
Цитата Сообщение от DarkMasterW Посмотреть сообщение
1) Что если число будет слишком большим и не поместиться в инт?
Будет обрезано до максимально допустимого.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
что если в char* будут не только цифры?
Цитата Сообщение от DarkMasterW Посмотреть сообщение
не цифры отсекаются при формировании входного char*
0
DarkMasterW
4 / 4 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 06:34  [ТС] 3
Цитата Сообщение от alsav22 Посмотреть сообщение
Будет обрезано до максимально допустимого.
как не допустить? Обрезать по количеству символов, загнать в long, потом в int?
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 06:40 4
Цитата Сообщение от DarkMasterW Посмотреть сообщение
как не допустить?
Как придумаете. Вариантов много.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Обрезать по количеству символов, загнать в long, потом в int?
Можно так, можно по-другому. Сами на свои вопросы отвечаете. Если хотите спросить: как лучше сделать, то без понятия, всё зависит от задач, условий и пр.
0
DarkMasterW
4 / 4 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 07:06  [ТС] 5
Спрашиваю потому, что не уверен в решении. Опыта ноль...
Суть задачи: в длл прилетает char*, в нем есть некоторый набор параметров для расчетов. Соответственно параметры надо перегнать в числовой тип. Надо сделать защиту от дурака. Контроль со стороны программы посылающей данные в длл невозможен.
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 08:02 6
Цитата Сообщение от DarkMasterW Посмотреть сообщение
в нем есть некоторый набор параметров для расчетов
Как выглядит этот набор? Что из себя представляет (или может представлять)? Как распологается в строке (или это слово?)?
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Соответственно параметры надо перегнать в числовой тип.
Какого типа?
0
Donnerwetter
40 / 40 / 17
Регистрация: 04.02.2014
Сообщений: 144
17.03.2014, 08:10 7
Цитата Сообщение от DarkMasterW Посмотреть сообщение
как не допустить? Обрезать по количеству символов, загнать в long, потом в int?
Если заранее известно, что переменная не будет принимать отрицательных значений, можно сразу исключить диапазон чисел меньше 0. Допустим, таким образом: unsigned long long. Такая запись увеличит ячейку памяти до 64 бит и поместится число 264-1.
0
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,673
17.03.2014, 08:29 8
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Собственно есть char*, надо в int. Вроде есть atoi для этих целей.
тогда есть atol или atof
http://devoid.com.ua/functions-about/c-functions/atof-atol.html
Цитата Сообщение от DarkMasterW Посмотреть сообщение
что если в char* будут не только цифры?
Функция прекращает чтение исходной строки как только появится первый символ,
от туда же
0
DarkMasterW
4 / 4 / 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
alsav22
5442 / 4837 / 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
DarkMasterW
4 / 4 / 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
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 10:58 12
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Оно все извлекается
Оно это что?
0
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,673
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
DarkMasterW
4 / 4 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 11:31  [ТС] 14
Цитата Сообщение от alsav22 Посмотреть сообщение
Оно это что?
вся строка исправно парсится в свои переменные. Вопрос только по безопасности парсинга dword'у по сути.
Цитата Сообщение от ValeryS Посмотреть сообщение
для 32 битных это int
во многих 32 битных компиляторах long=int=4
Видимо поэтому так и считал. Как раз времена были когда про 16 уже совсем забыли, а о 64 еще не думали.
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 11:34 15
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Вопрос только по безопасности парсинга dword'у по сути.
Разговор о втором слове в строке? Это имеется ввиду под dword?
0
DarkMasterW
4 / 4 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 11:39  [ТС] 16
да. хотя честно не совсем понимаю какая разница где оно находится...
0
HighPredator
5678 / 1999 / 720
Регистрация: 10.12.2010
Сообщений: 5,752
Записей в блоге: 3
17.03.2014, 11:44 17

Не по теме:

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

Сформулируйте задачу точнее.
0
DarkMasterW
4 / 4 / 1
Регистрация: 25.10.2013
Сообщений: 230
17.03.2014, 11:48  [ТС] 18
char* = "число"
необходимо конвертнуть
char* в dword
если число содержащееся в *char больше, чем помещается в dword, то вернуть ошибку.
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 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
alsav22
5442 / 4837 / 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 14:00

Работа со стеком. Если массив нужен float, а не int, что необходимо изменить
#include <iostream> #include <stdlib.h> using namespace std; //...

Что будет, если new вызвать 2 раза с одним и тем же указателем?
Собственно вопрос что будет? напрмер int *i=new(1); i=new(3); i будет сылаться...

Для чего используется _getch() и что будет, если ее не использовать?
_getch(); 1)для чего это? 2)что будет,если написать без него? ........


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru