Форум программистов, компьютерный форум 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. Просмотров 2705. Ответов 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
Посмотрите здесь:

Существует ли метод/функция перевода значения символьной переменной в int C++
string to int, int to string C++
string в int C++
C++ int в string
C++ из int в string
Моя реализация функции перевода STRING в DOUBLE C++
C++ String в Int
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 18:44     Моя реализация функции перевода string в int #2
А чего он у меня -44789 выводит?

Почему так не решил сделать?
C++
1
temp = a[i] - '0';
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.12.2012, 19:00     Моя реализация функции перевода string в int #3
sovaz1997, а вы в курсе что есть уже готовые такие функции http://en.cppreference.com/w/cpp/str...ic_string/stol
BRcr
4005 / 2294 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
21.12.2012, 19:01     Моя реализация функции перевода string в int #4
Пусть уж лучше stl трудится.
C++
1
2
3
4
5
6
7
8
9
10
11
long long str_to_int( string &str ) {
    long long tmp;
    stringstream ss( str );
    ss >> tmp;
    return tmp;
}
// ---------------------------------------------------------------------------
int main() {
    string s = "-4789";
    cout << str_to_int(s);
}
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 22:30  [ТС]     Моя реализация функции перевода string в int #5
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;//число, которое будет возвращено в main()
    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; break;}//проверка числа (+ или -)
 
        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;//если строка будет иметь "не int-овый" вид
        }
 
        num += (tmp * l);//сложение (составление результата)
    }
 
    if(anti == true) {return -num;}//если значение отрицательное
    else {return num;}//если значение положительное
}
P.S. Исправил ошибки

Добавлено через 21 минуту
Вверх
Wolkodav
601 / 454 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
21.12.2012, 22:31     Моя реализация функции перевода string в int #6
Да ладно вам, человек решил сам написать функцию перевода, что ж вы тут на него с stl.
ValeryS
Модератор
6485 / 4951 / 455
Регистрация: 14.02.2011
Сообщений: 16,400
21.12.2012, 22:52     Моя реализация функции перевода string в int #7
Цитата Сообщение от Wolkodav Посмотреть сообщение
Да ладно вам, человек решил сам написать функцию перевода, что ж вы тут на него с stl.
ну это дело хорошее
только посмотрел бы как другие делают

во первых вот это все
Цитата Сообщение от sovaz1997 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(a[i] == '0') {tmp = 0;}
else if(i == 0 && a[i] == '-') {anti = true; break;}//проверка числа (+ или -)
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;//если строка будет иметь "не int-овый" вид
}
будет жутко тормозить
ветвление штука долгая
и меняется все это примерно на такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int n=1;
int m=0;
for(int i =0;i<a.size();i++)
 {
           if(i==0 && a[i]=='-')
                {
                  n=-1; 
                  continue;
                }
          if( '0'<=a[i] &&a[i]<='9')
               {
                m*=10;
                m+= a[i]-'0';
               }
          else
              {
                return 0;//если строка будет иметь "не int-овый" вид
              }
    }
return m*n;
BRcr
4005 / 2294 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
21.12.2012, 22:58     Моя реализация функции перевода string в int #8
Начало положено, еще немного усилий и будет полный набор своих конверсионных функций, вот счастья-то будет!
ValeryS
Модератор
6485 / 4951 / 455
Регистрация: 14.02.2011
Сообщений: 16,400
21.12.2012, 23:06     Моя реализация функции перевода string в int #9
Цитата Сообщение от ValeryS Посмотреть сообщение
m+= a[i]-'0';
вот это можно заменить на
C++
1
m+= a[i]&0x0F;
правда не знаю добавит ли это скорости
а это
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
if( '0'<=a[i] &&a[i]<='9')
{
m*=10;
m+= a[i]-'0';
}
else
{
return 0;//если строка будет иметь "не int-овый" вид
}
на это
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
switch(a[i])
{
 case '0':
 case '1':
 case '2':
 case '3':
 case '4':
 case '5':
 case '6':
 case '7':
 case '8':
 case '9':
        m*=10;
       m+= a[i]-'0';
       break;
default:
      return 0;
}
если switch будет реализован таблично то скорость возрастет если нет останется прежней
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 23:09  [ТС]     Моя реализация функции перевода string в int #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
37
38
39
40
#include <iostream>
#include <string>
#include <cstdlib>
 
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') {
            char* ch = new char(a[i]);
            tmp = atoi(ch);
        }
 
        else if(i == 0 && a[i] == '-') {anti = true; break;}
 
 
        else {
                return 0;
        }
 
        num += (tmp * l);
    }
 
    if(anti == true) {return -num;}
    else {return num;}
}
Программа обновлена
ValeryS
Модератор
6485 / 4951 / 455
Регистрация: 14.02.2011
Сообщений: 16,400
21.12.2012, 23:13     Моя реализация функции перевода string в int #11
Цитата Сообщение от sovaz1997 Посмотреть сообщение
char* ch = new char(a[i]);
зачем ты выделяешь память?
кстати где удаляешь?
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 23:19  [ТС]     Моя реализация функции перевода string в int #12
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
#include <iostream>
#include <string>
#include <cstdlib>
 
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') {
            char* ch = new char(a[i]);
            tmp = atoi(ch);
            delete ch;
        }
 
        else if(i == 0 && a[i] == '-') {anti = true; break;}
 
 
        else {
                return 0;
        }
 
        num += (tmp * l);
    }
 
    if(anti == true) {return -num;}
    else {return num;}
}
Исправлена утечка памяти

Добавлено через 4 минуты
Вверх
ValeryS
Модератор
6485 / 4951 / 455
Регистрация: 14.02.2011
Сообщений: 16,400
21.12.2012, 23:22     Моя реализация функции перевода string в int #13
Цитата Сообщение от sovaz1997 Посмотреть сообщение
Исправлена утечка памяти
еще раз спрошу
Цитата Сообщение от ValeryS Посмотреть сообщение
зачем ты выделяешь память?
это дорогого стоит
да и atoi просит строку а не символ
чем тебе
C++
1
 a[i]-'0'
не угодил
а если ты взялся за atoi то незачем огород городить, введи в неё свою строку она и вернет число
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 23:23  [ТС]     Моя реализация функции перевода string в int #14
Цитата Сообщение от ValeryS Посмотреть сообщение
а если ты взялся за atoi то незачем огород городить, введи в неё ссвою строку она и вернет число
В том-то и дело, что я хотел сам реализовать эту функцию
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
21.12.2012, 23:24     Моя реализация функции перевода string в int #15
quote=sovaz1997;3896851]
C++
1
2
3
char* ch = new char(a[i]);
tmp = atoi(ch);
delete ch;
[/quote]
atoi вроде принимает С-строку, а не указатель на один символ, т.е. '\0' не хватает. Не понятно, почему не просто tmp = a[i] - '0';
ValeryS
Модератор
6485 / 4951 / 455
Регистрация: 14.02.2011
Сообщений: 16,400
21.12.2012, 23:24     Моя реализация функции перевода string в int #16
Цитата Сообщение от sovaz1997 Посмотреть сообщение
В том-то и дело, что я хотел сам реализовать эту функцию
Функция atoi (ASCII to integer, из ASCII в целое число) в языке программирования Си используется для приведения (конвертации) строки в числовой вид.
int atoi(const char *str)

Аргумент str означает строку, представленную в виде массива символов, содержащего символы знакового целого (тип int) числа. Строка должна быть нуль-терминированной, то есть оканчиваться символом «\0». Когда atoi() получает строку без числовых последовательностей, то в этом случае возвращает ноль (0). Если строка содержит корректную последовательность цифр, представляющих число 0, то также возвращается 0, при этом по возвращаемому числу невозможно определить содержит ли строка корректное число или нет.
тогда уж напиши
C++
1
2
3
int str_to_int(string a) {
 return atoi(a);
}
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 23:24  [ТС]     Моя реализация функции перевода string в int #17
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;}
}
Программа обновлена
ValeryS
Модератор
6485 / 4951 / 455
Регистрация: 14.02.2011
Сообщений: 16,400
21.12.2012, 23:27     Моя реализация функции перевода string в int #18
Цитата Сообщение от gray_fox Посмотреть сообщение
atoi вроде принимает С-строку, а не указатель на один символ, т.е. '\0' не хватает.
скорее всего он там есть
в отладочном режиме память выделяется и окружается нулями
вот тебе и строка
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
22.12.2012, 04:15     Моя реализация функции перевода string в int #19
В цикле изменяются две переменные: i и l. При этом последняя зачем-то имеет тип double. Нет, не так... Она зачем-то есть. Т.е. она помогает определить на 10 в какой степени нужно умножить очередное число, чтобы оно попало в нужный разряд в результате. В общем, сложно. А все потому, что по строке идем с конца.

Переворачиваем. Убираем "эль" (и вообще переменные с такими названиями тяжело распознаются глазами), по строке идем в привычном порядке от 0 до n, когда встречаем очередной символ, который можем дописать в конец результата, этот результат умножаем на 10 и прибавляем очередное число.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 05:16     Моя реализация функции перевода 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, 05:16     Моя реализация функции перевода string в int #20
Цитата Сообщение от ValeryS Посмотреть сообщение
скорее всего он там есть
в отладочном режиме память выделяется и окружается нулями
вот тебе и строка
не "окружается нулями". что там за границами зарезервированной new области - черт его знает.
к тому же, atoi получит ровно столько, сколько зарезервировал new. а это размер ровно 1ого символа.
в общем дополнительно нуль-байту там не откуда взяться

да и вправду, зачем тут вобще atoi
Yandex
Объявления
22.12.2012, 05:16     Моя реализация функции перевода string в int
Ответ Создать тему
Опции темы

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