CEO SOVAZ Corp.
|
||||||
1 | ||||||
Моя реализация функции перевода string в int21.12.2012, 18:23. Показов 7307. Ответов 57
P.S. Пишите предложения по улучшению этой функции Добавлено через 5 минут Актуальна Добавлено через 5 минут Вверх
0
|
21.12.2012, 18:23 | |
Ответы с готовыми решениями:
57
Моя реализация функции перевода STRING в DOUBLE Реализация функции char *padl(const char *string, int len, int c=' ') Моя реализация алгоритма перевода числа в пропись (русский язык) Too few parameters in call to 'Lechebnica::AddNewElement(int,int,string,string,int,string) |
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
|
||||||
22.12.2012, 21:09 | 43 | |||||
и так поехали
"Пастернака не читал но осуждаю" во первых какой компилятор? во вторых в каком режиме? нет он только начинается еще раз во первых какой компилятор? во вторых в каком режиме? никто не гарантировал что вокруг памяти будут 0 но у ТС срабатывает эта строка
хотелось бы верить но в жизни все не так в отладочном режиме ты выделяешь 100 байт а выделяется 200(к примеру) и сверху и снизу есть защитный буфер при обращении к которому вызывается исключение в режиме реализации ничего такого нет, поэтому можно получить странное поведение еще раз если ты что то утверждаешь приводи ассемблерные листинги(хотя бы для одного конкретного компилятора) ссылку в листинге, а не свои размышления. где он их запоминает? формат памяти в дампах? и смело возвращает 0 спасибо что ты напомнил мне как устроена строка в С еще раз спасибо в общем давайте спорить о вкусе устриц с теми хоть однажды их ел кстати ты не ответил на такой вопрос выделено 5 байт посредине я вставил 0 т.е строка всего три байта что выдаст atoi? по твоей логике 5367( я же пять байт выделил) по моей 53( строка кончилась) противоречия не чествуем? в статике нет new
1
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
22.12.2012, 21:31 | 45 |
Ну не совсем. Если были до буквенного символа цифры, то возвращается то самое число. Например строка "123b123" вернет число 123. Так же игнорируются первые пробельные символы. Например строка " \t 123b123" вернет все тоже число 123. Ну и само собой засчитывается символы + и -, если они перед первой цифрой стоят.
0
|
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
|
||||||
22.12.2012, 23:13 | 47 | |||||
Вот писал на чистом Си(не С99)
<ctype.h> не юзал. Только функции ввода/вывода. <stdlib.h> для system();
Если будут конфликтовать идентификаторы, то либо компилить с другими ключами, либо добавить макросы.
1
|
23.12.2012, 01:01 | 50 | |||||
go, я попробовал реализовать перевод из одной СС в другую, можете посмотреть?
0
|
14 / 14 / 1
Регистрация: 20.04.2010
Сообщений: 102
|
|||||||||||
23.12.2012, 06:48 | 51 | ||||||||||
Сообщение от ValeryS
Сообщение от ValeryS
Сообщение от ValeryS
еще раз, на пальцах объясню, каким чудом это работает в нашем случае: 1. atoi начинает сканировать строку. видит, первый символ - число. все нормально, сканирует дальше. 2. видит, 2ой элемент массива не число (мусор пошел). игнорирует его - завершает разбор. переводит найденную до того цифру к int и возвращает значение. 3. 0 atoi возвращает ежели в переданном массиве не встретилось вообще ни одного числа, либо перед цифрами имелся не числовой символ (за исключением \t, +, -) в общем, мифические "зануления" здесь не причем.
Сообщение от ValeryS
подтверждаю рабочим примером:
Сообщение от ValeryS
2. почему примеры говорят об обратном? ну не видит VS никаких исключений, а мусор видит и массивы за границей памяти спокойно инициализирует. и я не полезу в ассемблер дабы это проверять, потому как пока что верю своим глазам и таки знаю стандарты.
Сообщение от ValeryS
Сообщение от ValeryS
мной имелось ввиду, что динамический char массив не терминуется нулем при его инициализации. new инициализирует ровно столько байт, сколько нужно для размещения переданного аргумента. про статику. видимо невнимательно читаешь, либо специально делаешь из меня дурака. конструкция:
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
23.12.2012, 07:23 | 52 |
0
|
23.12.2012, 11:23 | 53 |
Зануления нет, конечно - это было бы крайне неэффективно.
Но вот шариться за пределами выделенной памяти получится лишь до поры до времени, пока не попытаешься модифицировать чужой выделенный кусок.
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
23.12.2012, 11:31 | 54 |
Да легко.
Это Си++. Один из его императивов: не мешать творить что угодно, если этого явно просят. Поэтому в стандарте обращение к невыделенной памяти описано как UB. Можно это делать, но под свою ответственность. Поэтому никакие проверки выделенности не обязаны выполняться, если самостоятельно их не выполнять. Это может быть как использование аналога обёртки над std::vector с проверкой границ, так и запуск программы под каким-нибудь Валгриндом. Максимум операционка по носу даст сегфолтом за обращения к невыделенным страницам, но и то, она может это не делать, и buffer overflow в пределах страницы это не детектит.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
23.12.2012, 12:21 | 56 |
Нельзя просто так получить доступ к чужой памяти. Не такими способами как Вы думаете. new ( malloc и другие аллокаторы ) часто выделяют память с запасом. Вот по этому запасу и удается беспроблемно гулять, потому что это память размечена ОС для вашей программы. Вот дальше этой памяти уже идет не размеченная область. Она никуда не указывает, эти адреса виртуального пространства просто напросто не связаны ОС с физическими адресами памяти. При доступе к ним ( чтение/запись ) программа просто падает. Так же можно без проблем гулять и по памяти, которая была выделена при запуске ( стек, глобальные/статические переменные ).
0
|
CEO SOVAZ Corp.
|
|
23.12.2012, 15:06 [ТС] | 58 |
Актуальна
0
|
23.12.2012, 15:06 | |
23.12.2012, 15:06 | |
Помогаю со студенческими работами здесь
58
Метод int MmPp(string str) для перевода строковой даты в число Создайте класс Animal. Добавьте поля string Name, string Kind, string Areal, int Population Создайте класс Animal. Добавьте поля string Name, string Kind, string Areal, int Population Функция isspace и тип string: Не существует подходящей функции преобразования из "std::string" в "int" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |