Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 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. Просмотров 2955. Ответов 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 минут
Вверх
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2012, 18:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Моя реализация функции перевода string в int (C++):

Моя реализация функции перевода STRING в DOUBLE - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; double str_to_double(string a); int main() { string s =...

Реализация функции char *padl(const char *string, int len, int c=' ') - C++
Реализовать функцию возвращающую указатель на новую строку длины len, полученную из string либо удалением лишних символов слева , либо...

Функция isspace и тип string: Не существует подходящей функции преобразования из "std::string" в "int" - C++
Добрый день! Я только начинаю изучать язык c++ по книге &quot;Язык программирования С++. Базовый курс 5-е изд 2014(Стэнли Б. Липпман)&quot;. ...

Функции float average(int arrray[],int from,int to) - C++
Напишите код функции float average(int arrray,int from,int to). Возвращаемым значением функции должно быть среднее значение элементов...

Как вставить элемент и вывести элементы на экран в map<string, map<string,int>> ? - C++
У меня есть map&lt;string, map&lt;string,int&gt;&gt;, в него надо добавить элементы (типа Ivanov potato 200) Использовать именно map&lt;string,...

Не существует подходящей функции преобразования из "std::string" в "int" - C++
Я только начинаю изучать язык c++ по книге &quot;Язык программирования С++. Базовый курс 5-е изд 2014(Стэнли Б. Липпман)&quot;. Упр.3.17 ...

57
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 18:44 #2
А чего он у меня -44789 выводит?

Почему так не решил сделать?
C++
1
temp = a[i] - '0';
0
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.12.2012, 19:00 #3
sovaz1997, а вы в курсе что есть уже готовые такие функции http://en.cppreference.com/w/cpp/string/basic_string/stol
1
BRcr
4010 / 2299 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
21.12.2012, 19:01 #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);
}
1
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 22:30  [ТС] #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 минуту
Вверх
0
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
21.12.2012, 22:31 #6
Да ладно вам, человек решил сам написать функцию перевода, что ж вы тут на него с stl.
1
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,232
21.12.2012, 22:52 #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;
1
BRcr
4010 / 2299 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
21.12.2012, 22:58 #8
Начало положено, еще немного усилий и будет полный набор своих конверсионных функций, вот счастья-то будет!
1
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,232
21.12.2012, 23:06 #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 будет реализован таблично то скорость возрастет если нет останется прежней
0
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 23:09  [ТС] #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;}
}
Программа обновлена
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,232
21.12.2012, 23:13 #11
Цитата Сообщение от sovaz1997 Посмотреть сообщение
char* ch = new char(a[i]);
зачем ты выделяешь память?
кстати где удаляешь?
1
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 23:19  [ТС] #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 минуты
Вверх
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,232
21.12.2012, 23:22 #13
Цитата Сообщение от sovaz1997 Посмотреть сообщение
Исправлена утечка памяти
еще раз спрошу
Цитата Сообщение от ValeryS Посмотреть сообщение
зачем ты выделяешь память?
это дорогого стоит
да и atoi просит строку а не символ
чем тебе
C++
1
 a[i]-'0'
не угодил
а если ты взялся за atoi то незачем огород городить, введи в неё свою строку она и вернет число
1
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 23:23  [ТС] #14
Цитата Сообщение от ValeryS Посмотреть сообщение
а если ты взялся за atoi то незачем огород городить, введи в неё ссвою строку она и вернет число
В том-то и дело, что я хотел сам реализовать эту функцию
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
21.12.2012, 23:24 #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';
1
21.12.2012, 23:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2012, 23:24
Привет! Вот еще темы с ответами:

Существует ли метод/функция перевода значения символьной переменной в int - C++
Хотел спросить, существует ли метод/функция перевода значения символьной ПЕРЕМЕННОЙ в int?

Std::string и символ перевода строки - C++
Вот такая простейшая программа: #include &lt;stdio.h&gt; #include &lt;string&gt; using namespace std; int main() { char t=&quot;asd\n&quot;; ...

Скоростная реализация перевода символьной строки в численные массивы - C++
Здравствуйте! Недавно загорелся идеей создать свой собственный класс больших чисел (с десятичной дробью) Для этого я буду использовать...

Int to String - C++
Подскажите стандартную функцию для конвертирования Int to String или других чисел в string


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

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

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