Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
#1

Моя реализация функции перевода string в int - C++

21.12.2012, 18:23. Просмотров 2812. Ответов 57

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <string>
 
using namespace std;
 
int str_to_int(string a);
 
int main() {
    string s = "-4789";
    cout << str_to_int(s);
}
 
int str_to_int(string a) {
    int num = 0;
    int tmp;
    bool anti = false;
 
    for(int i = a.size() - 1, l = 1; i >= 0; --i, l *= 10) {
        if(a[i] == '0') {tmp = 0;}
 
        else if(i == 0 && a[i] == '-') {anti = true;}
 
        else if(a[i] == '1') {tmp = 1;}
        else if(a[i] == '2') {tmp = 2;}
        else if(a[i] == '3') {tmp = 3;}
        else if(a[i] == '4') {tmp = 4;}
        else if(a[i] == '5') {tmp = 5;}
        else if(a[i] == '6') {tmp = 6;}
        else if(a[i] == '7') {tmp = 7;}
        else if(a[i] == '8') {tmp = 8;}
        else if(a[i] == '9') {tmp = 9;}
 
        else {
                return 0;
        }
 
        num += (tmp * l);
    }
 
    if(anti == true) {return -num;}
    else {return num;}
}


P.S. Пишите предложения по улучшению этой функции

Добавлено через 5 минут
Актуальна

Добавлено через 5 минут
Вверх
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2012, 18:23     Моя реализация функции перевода string в int
Посмотрите здесь:
Моя реализация функции перевода STRING в DOUBLE C++
Не существует подходящей функции преобразования из "std::string" в "int" C++
Существует ли метод/функция перевода значения символьной переменной в int C++
C++ Std::string и символ перевода строки
Скоростная реализация перевода символьной строки в численные массивы C++
string to int, int to string C++
string в int C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,731
22.12.2012, 12:48     Моя реализация функции перевода string в int #31
Цитата Сообщение от sovaz1997 Посмотреть сообщение
Сложность SeregaC++ - O(длина строки X 10)
это не самое главное (хотя тоже не маловажно)
скорми его алгоритму вот это

Цитата Сообщение от ValeryS Посмотреть сообщение
а как отобразится число 123вася123
и он вернет 123123
нет анализ на недопустимость
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 12:49  [ТС]     Моя реализация функции перевода string в int #32
Цитата Сообщение от diagon Посмотреть сообщение
только это как бы равно
Почему? - ведь цикл проходит 10 раз, а мой if только сравнивает?
P.S. Или я что-то не понимаю?
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
22.12.2012, 12:50     Моя реализация функции перевода string в int #33
Цитата Сообщение от sovaz1997 Посмотреть сообщение
P.S. Или я что-то не понимаю?
Именно так.
У вас будет меньше константа, но сложность-то одинаковая.
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
22.12.2012, 12:55     Моя реализация функции перевода string в int #34
Цитата Сообщение от sovaz1997 Посмотреть сообщение
Все эти программы работают достаточно быстро (но моя быстрей в 10 раз
Твоя.
Моя.

Ну не в 10 раз.
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 13:27  [ТС]     Моя реализация функции перевода string в int #35
P.S. Я еще проверил память - моя побольше 720кб, а твоя 712кб. Это потому, что я по ссылке не передаю string и в одном месте использую тип double, а не int

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <string>
 
using namespace std;
 
int str_to_int(string& a);
 
int main() {
    string s = "-768";
    cout << str_to_int(s);
    cin.get();
}
 
int str_to_int(string& a) {
    int num = 0;
    char tmp;
    bool anti = false;
    int l = 1;
 
    for(int i = a.size() - 1; i >= 0; --i, l *= 10) {
        if(a[i] == '0') {tmp = 0;}
 
        if(a[i] >= '0' && a[i] <= '9') {tmp = a[i] - '0';}
 
        else if(i == 0 && a[i] == '-') {anti = true; break;}
 
 
        else {
                return 0;
        }
 
        num += (tmp * l);
    }
 
    if(anti == true) {return -num;}
    else {return num;}
}
Улучшил работу с памятью

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <string>
 
using namespace std;
 
int str_to_int(string& a);
 
int main() {
    string s = "-68";
    cout << str_to_int(s);
    cin.get();
}
 
int str_to_int(string& a) {
    int num = 0;
    char tmp;
    int l = 1;
 
    for(char i = a.size() - 1; i >= 0; --i, l *= 10) {
        if(a[i] == '0') {tmp = 0;}
 
        if(a[i] >= '0' && a[i] <= '9') {tmp = a[i] - '0';}
 
        else if(i == 0 && a[i] == '-') {break;}
 
 
        else {
                return 0;
        }
 
        num += (tmp * l);
    }
 
    if(a[0] == '-') {return -num;}
    else {return num;}
}
Теперь программа занимает 708 КБ ОЗУ. Достигнута высшая оптимизация (как и в настоящей ф-ии atoi())

Добавлено через 14 минут
Вверх
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,731
22.12.2012, 13:28     Моя реализация функции перевода string в int #36
Цитата Сообщение от sovaz1997 Посмотреть сообщение
Теперь программа занимает 708 КБ ОЗУ. Достигнута высшая оптимизация
тебе до оптимизации еще пахать и пахать
например при каждой итерации проверяем
Цитата Сообщение от sovaz1997 Посмотреть сообщение
else if(i == 0 && a[i] == '-')
значит надо вынести за цикл
Цитата Сообщение от sovaz1997 Посмотреть сообщение
if(a[i] == '0') {tmp = 0;}
зачем это сравнение которое дублирует следующая строчка

Цитата Сообщение от sovaz1997 Посмотреть сообщение
if(a[i] >= '0' && a[i] <= '9') {tmp = a[i] - '0';}
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 13:29     Моя реализация функции перевода string в int #37
А зачем для нуля отдельная проверка?
C++
1
if(a[i] == '0') {tmp = 0;}

Не по теме:

опоздал)

0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
22.12.2012, 13:30     Моя реализация функции перевода string в int #38
Цитата Сообщение от diagon Посмотреть сообщение
И вообще, зачем вы пишите все эти велосипеды?

Не по теме:

Из велосипедов я плюсанул бы за свою реализацию STL. Полезнее будет.

Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
22.12.2012, 13:51     Моя реализация функции перевода string в int #39
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int myAtoi( std::string &str ) {
   bool sign = str[ 0 ] == '-';
   int n = 0;
   
   for( int i = sign ; i < str.size(); i++ ) {
      if( str[ i ] > '9' || str[ i ] < '0' )
         return 0;
      else
         n = n * 10 + ( str[ i ] - '0' );
   }
   
   if ( sign )
      return -n;
   
   return n;
}
Работает немного быстрее, чем atoi при O2 оптимизации в gcc.
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
22.12.2012, 16:04     Моя реализация функции перевода string в int #40
Цитата Сообщение от ValeryS
ты когда нибудь дизасемблировал Debug версию?
зачем лезть в асм. все проверяется куда проще:
C++
1
2
3
string a="123456789";
    char* c = new char (a[1]);
    cout<<c<<endl;
cout выводит поток символов до тех пор, пока не встретит \0. результат:
2¤¤¤¤▌▌▌°
Для продолжения нажмите любую клавишу . . .
как видишь, никакого \0 в памяти после двойки нет, ничего там компилятор вокруг двойки не занулял.
cout вывел мусор пока случайно не наткнулся на пустой байт.
думаю, на этом спор исчерпан.
Цитата Сообщение от ValeryS Посмотреть сообщение
как же по твоему отлавливать выход за пределы памяти
это делается не "занулением". new резервирует необходимое кол-во байт в незанятой памяти. компилятор это число запоминает и при попытке изменить значение ячейки ОП вне выделенного числа байт выдает ошибку. ничего за ее пределами он не "зануляет". это неэффективный расход памяти и опасно в конце концов. можно попасть не в свою память и что-нибудь важное "занулить".

Цитата Сообщение от ValeryS
а самый главный аргумент
atoi принимает строку
у ТС работает эта конструкция

C++
1
2
char* ch = new char(a[i]);
tmp = atoi(ch);
значит после памяти есть 0 и ch волшебным образом превращается в строку
она работает не потому что ch терминирован '\0', а потому что:
1. atoi игнорирует символы, не являющиеся числом. грубо говоря, в данной ситуации, он не обращает внимания на весь тот мусор, что лежит после 1 ого числового символа.
2. сканирует память до первого встретившегося \0. а он рано или поздно там встретиться. только вот сколько ему придется прочитать для этого байт - черт его знает. вот чтобы не пришлось читать лишнюю память, в спецификации и требуется \0 в конце.

Добавлено через 4 минуты
Цитата Сообщение от ValeryS
а если статическую строку дам?
статическая char строка терминуется \0 всегда. это стандарт языка. и лежит она в программном стеке, а не куче, где работает new.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
22.12.2012, 16:11     Моя реализация функции перевода string в int #41
Цитата Сообщение от sovaz1997 Посмотреть сообщение
Моя реализация функции перевода string в int
Это не серьезно. Добавте системы счисление. Я когда-то strtol реализовывал. Могу код поискать.
MrGluck
Модератор
Эксперт CЭксперт С++
7162 / 4328 / 632
Регистрация: 29.11.2010
Сообщений: 11,750
22.12.2012, 16:47     Моя реализация функции перевода string в int #42
Почему все так упорно игнорируют isdigit, isalpha?
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,731
22.12.2012, 21:09     Моя реализация функции перевода string в int #43
и так поехали
Цитата Сообщение от fit Посмотреть сообщение
зачем лезть в асм. все проверяется куда проще:
"Пастернака не читал но осуждаю"
Цитата Сообщение от fit Посмотреть сообщение
как видишь, никакого \0 в памяти после двойки нет,
во первых какой компилятор? во вторых в каком режиме?
Цитата Сообщение от fit Посмотреть сообщение
думаю, на этом спор исчерпан.
нет он только начинается
еще раз
во первых какой компилятор? во вторых в каком режиме?
никто не гарантировал что вокруг памяти будут 0 но у ТС срабатывает эта строка
C++
1
int m=atoi(buf);
значит никакого мусора нет (иначе бы ноль вернула)
Цитата Сообщение от fit Посмотреть сообщение
это делается не "занулением". new резервирует необходимое кол-во байт в незанятой памяти. компилятор это число запоминает и при попытке изменить значение ячейки ОП вне выделенного числа байт выдает ошибку.
хотелось бы верить но в жизни все не так
в отладочном режиме ты выделяешь 100 байт а выделяется 200(к примеру) и сверху и снизу есть защитный буфер при обращении к которому вызывается исключение
в режиме реализации ничего такого нет, поэтому можно получить странное поведение
еще раз если ты что то утверждаешь приводи ассемблерные листинги(хотя бы для одного конкретного компилятора)

Цитата Сообщение от fit Посмотреть сообщение
это делается не "занулением". new резервирует необходимое кол-во байт в незанятой памяти. компилятор это число запоминает и при попытке изменить значение ячейки ОП вне выделенного числа байт выдает ошибку.
ссылку в листинге, а не свои размышления.
где он их запоминает? формат памяти в дампах?

Цитата Сообщение от fit Посмотреть сообщение
она работает не потому что ch терминирован '\0', а потому что:
1. atoi игнорирует символы, не являющиеся числом.
и смело возвращает 0
Цитата Сообщение от fit Посмотреть сообщение
сканирует память до первого встретившегося \0. а он рано или поздно там встретиться. только вот сколько ему придется прочитать для этого байт - черт его знает. вот чтобы не пришлось читать лишнюю память, в спецификации и требуется \0 в конце.
спасибо что ты напомнил мне как устроена строка в С
Цитата Сообщение от fit Посмотреть сообщение
статическая char строка терминуется \0 всегда. это стандарт языка. и лежит она в программном стеке, а не куче, где работает new.
еще раз спасибо
в общем давайте спорить о вкусе устриц с теми хоть однажды их ел
кстати ты не ответил на такой вопрос
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
2
3
4
5
6
7
char *buf=new char[5];
buf[0]='5';
buf[1]='3';
buf[2]=0;
buf[3]='6';
buf[4]='7';
int m=atoi
(buf);
выделено 5 байт
посредине я вставил 0 т.е строка всего три байта
что выдаст atoi?
по твоей логике 5367( я же пять байт выделил)
по моей 53( строка кончилась)


Цитата Сообщение от fit Посмотреть сообщение
статическая char строка терминуется \0 всегда.
Цитата Сообщение от fit Посмотреть сообщение
к тому же, atoi получит ровно столько, сколько зарезервировал new.
противоречия не чествуем?
в статике нет new
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 21:22  [ТС]     Моя реализация функции перевода string в int #44
Актуальна
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 21:31     Моя реализация функции перевода string в int
Еще ссылки по теме:
C++ Int to string
C++ из int в string
C++ Int to String
C++ String в Int
Int to string C++

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

Или воспользуйтесь поиском по форуму:
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
22.12.2012, 21:31     Моя реализация функции перевода string в int #45
Цитата Сообщение от ValeryS Посмотреть сообщение
и смело возвращает 0
Ну не совсем. Если были до буквенного символа цифры, то возвращается то самое число. Например строка "123b123" вернет число 123. Так же игнорируются первые пробельные символы. Например строка " \t 123b123" вернет все тоже число 123. Ну и само собой засчитывается символы + и -, если они перед первой цифрой стоят.
Yandex
Объявления
22.12.2012, 21:31     Моя реализация функции перевода string в int
Ответ Создать тему
Опции темы

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