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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 18:23     Моя реализация функции перевода string в int #1
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
Посмотрите здесь:

Существует ли метод/функция перевода значения символьной переменной в int C++
string to int, int to string C++
string в int C++
C++ int в string
C++ из int в string
Моя реализация функции перевода STRING в DOUBLE C++
C++ String в Int
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
22.12.2012, 05:29     Моя реализация функции перевода string в int #21
Цитата Сообщение от fit Посмотреть сообщение
не "окружается нулями". что там за границами зарезервированной new области - черт его знает.
Как минимум есть такая штука (по крайней мере в VS) как guard bytes - некоторые магические значения, которые добавляются до и после выделенной в куче памяти в дебаге. Первый байт этого значения вполне может быть нулём. И тогда нуль-терминал у строки есть, всё вроде хорошо - в дебаге) А в релизе будет access violation (или что-нибудь в этом роде).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6413 / 4879 / 448
Регистрация: 14.02.2011
Сообщений: 16,180
22.12.2012, 11:17     Моя реализация функции перевода string в int #22
Цитата Сообщение от fit Посмотреть сообщение
не "окружается нулями". что там за границами зарезервированной new области - черт его знает.
ты когда нибудь дизасемблировал Debug версию?
как же по твоему отлавливать выход за пределы памяти
а самый главный аргумент
atoi принимает строку
у ТС работает эта конструкция
C++
1
2
char* ch = new char(a[i]);
tmp = atoi(ch);
значит после памяти есть 0 и ch волшебным образом превращается в строку

Цитата Сообщение от fit Посмотреть сообщение
к тому же, atoi получит ровно столько, сколько зарезервировал new.
а откуда он знает сколько зарегистрировал new?
а если я так напишу
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);
сколько будет m?

а если статическую строку дам?
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 11:27  [ТС]     Моя реализация функции перевода string в int #23
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 = "-7868";
    cout << str_to_int(s);
}
 
int str_to_int(string a) {
    int num = 0;
    int tmp;
    bool anti = false;
    double 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;}
}
P.S. Чтобы было видно

Добавлено через 8 минут
Вверх
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
22.12.2012, 12:37     Моя реализация функции перевода string в int #24
Я так сделал:
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
#include <iostream>
 
int StrToInt(std::string);
 
int main()
{
    std::cout << StrToInt("1995") << std::endl;
 
    system("PAUSE");
    return 0;
}
 
int StrToInt(std::string str)
{
    int convert_str = 0;
    std::string str_n = "0123456789";
 
    for (int i = 0; i < str.size(); i++) {
        for (int cnt = 0; cnt < 10; cnt++)
            if (str[i] == str_n[cnt]) 
                convert_str = convert_str * 10 + cnt;
    }
    if (str[0] == '-') return -convert_str;
    else return convert_str;
}
ValeryS
Модератор
6413 / 4879 / 448
Регистрация: 14.02.2011
Сообщений: 16,180
22.12.2012, 12:40     Моя реализация функции перевода string в int #25
Цитата Сообщение от SeregaC++ Посмотреть сообщение
Я так сделал:
И сколько раз у тебя будет крутится этот цикл
Цитата Сообщение от SeregaC++ Посмотреть сообщение
for (int cnt = 0; cnt < 10; cnt++)
* * * * * * if (str[i] == str_n[cnt])
при числе 999 999
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 12:41  [ТС]     Моя реализация функции перевода string в int #26
Цитата Сообщение от SeregaC++ Посмотреть сообщение
#include <iostream>
int StrToInt(std::string);
int main()
{
* * std::cout << StrToInt("1995") << std::endl;
system("PAUSE");
* * return 0;
}
int StrToInt(std::string str)
{
* * int convert_str = 0;
* * std::string str_n = "0123456789";
for (int i = 0; i < str.size(); i++) {
* * * * for (int cnt = 0; cnt < 10; cnt++)
* * * * * * if (str[i] == str_n[cnt])
* * * * * * * * convert_str = convert_str * 10 + cnt;
* * }
* * if (str[0] == '-') return -convert_str;
* * else return convert_str;
}


P.S. Вы, наверное, единственный человек, кто это увидел и в БЛОГЕ, и ЗДЕСЬ
ValeryS
Модератор
6413 / 4879 / 448
Регистрация: 14.02.2011
Сообщений: 16,180
22.12.2012, 12:41     Моя реализация функции перевода string в int #27
а как отобразится число 123вася123 ?
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 12:45  [ТС]     Моя реализация функции перевода string в int #28
Все эти программы работают достаточно быстро (но моя быстрей в 10 раз, потому что один цикл )
Сложность моей - O(длина строки);
Сложность SeregaC++ - O(длина строки X 10)
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
22.12.2012, 12:47     Моя реализация функции перевода string в int #29
Цитата Сообщение от sovaz1997 Посмотреть сообщение
O(длина строки X 10
только это как бы равно
Цитата Сообщение от sovaz1997 Посмотреть сообщение
O(Длина строки)
И вообще, зачем вы пишите все эти велосипеды? Попробуйте написать функцию, которая переводит из любого типа в любой(ну или выдает ошибку компиляции, если это невозможно). Она пишется в ~5 строк.
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 12:48  [ТС]     Моя реализация функции перевода string в int #30
SeregaC++, зачем ты переделал мою программу в худшую сторону
Цикл внутри цикла удлинит время работы программы на порядок. Чем тебе не нравится сравнение:
C++
1
if(a[i] >= '0' && a[i] <= '9') {tmp = a[i] - '0';}
Вместо этого ты зачем-то вставил цикл...
ValeryS
Модератор
6413 / 4879 / 448
Регистрация: 14.02.2011
Сообщений: 16,180
22.12.2012, 12:48     Моя реализация функции перевода string в int #31
Цитата Сообщение от sovaz1997 Посмотреть сообщение
Сложность SeregaC++ - O(длина строки X 10)
это не самое главное (хотя тоже не маловажно)
скорми его алгоритму вот это

Цитата Сообщение от ValeryS Посмотреть сообщение
а как отобразится число 123вася123
и он вернет 123123
нет анализ на недопустимость
sovaz1997
CEO SOVAZ Corp.
 Аватар для sovaz1997
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 12:49  [ТС]     Моя реализация функции перевода string в int #32
Цитата Сообщение от diagon Посмотреть сообщение
только это как бы равно
Почему? - ведь цикл проходит 10 раз, а мой if только сравнивает?
P.S. Или я что-то не понимаю?
diagon
Higher
 Аватар для diagon
1921 / 1187 / 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.
 Аватар для sovaz1997
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
Модератор
6413 / 4879 / 448
Регистрация: 14.02.2011
Сообщений: 16,180
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
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 13:29     Моя реализация функции перевода string в int #37
А зачем для нуля отдельная проверка?
C++
1
if(a[i] == '0') {tmp = 0;}

Не по теме:

опоздал)

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

Не по теме:

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

Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 16:04     Моя реализация функции перевода string в int
Еще ссылки по теме:

C++ Int to String
Int to string C++
Не существует подходящей функции преобразования из "std::string" в "int" C++
Скоростная реализация перевода символьной строки в численные массивы C++
C++ Std::string и символ перевода строки

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

Или воспользуйтесь поиском по форуму:
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.
Yandex
Объявления
22.12.2012, 16:04     Моя реализация функции перевода string в int
Ответ Создать тему

Метки
atoi, int, itoa, string
Опции темы

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