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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 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. Просмотров 2960. Ответов 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
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,252
21.12.2012, 23:24 #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);
}
0
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
21.12.2012, 23:24  [ТС] #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;}
}
Программа обновлена
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,252
21.12.2012, 23:27 #18
Цитата Сообщение от gray_fox Посмотреть сообщение
atoi вроде принимает С-строку, а не указатель на один символ, т.е. '\0' не хватает.
скорее всего он там есть
в отладочном режиме память выделяется и окружается нулями
вот тебе и строка
1
0x10
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
22.12.2012, 04:15 #19
В цикле изменяются две переменные: i и l. При этом последняя зачем-то имеет тип double. Нет, не так... Она зачем-то есть. Т.е. она помогает определить на 10 в какой степени нужно умножить очередное число, чтобы оно попало в нужный разряд в результате. В общем, сложно. А все потому, что по строке идем с конца.

Переворачиваем. Убираем "эль" (и вообще переменные с такими названиями тяжело распознаются глазами), по строке идем в привычном порядке от 0 до n, когда встречаем очередной символ, который можем дописать в конец результата, этот результат умножаем на 10 и прибавляем очередное число.
0
fit
14 / 14 / 0
Регистрация: 20.04.2010
Сообщений: 102
22.12.2012, 05:16 #20
Цитата Сообщение от ValeryS Посмотреть сообщение
скорее всего он там есть
в отладочном режиме память выделяется и окружается нулями
вот тебе и строка
не "окружается нулями". что там за границами зарезервированной new области - черт его знает.
к тому же, atoi получит ровно столько, сколько зарезервировал new. а это размер ровно 1ого символа.
в общем дополнительно нуль-байту там не откуда взяться

да и вправду, зачем тут вобще atoi
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
22.12.2012, 05:29 #21
Цитата Сообщение от fit Посмотреть сообщение
не "окружается нулями". что там за границами зарезервированной new области - черт его знает.
Как минимум есть такая штука (по крайней мере в VS) как guard bytes - некоторые магические значения, которые добавляются до и после выделенной в куче памяти в дебаге. Первый байт этого значения вполне может быть нулём. И тогда нуль-терминал у строки есть, всё вроде хорошо - в дебаге) А в релизе будет access violation (или что-нибудь в этом роде).
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,252
22.12.2012, 11:17 #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?

а если статическую строку дам?
0
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 11:27  [ТС] #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 минут
Вверх
0
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
22.12.2012, 12:37 #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;
}
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,252
22.12.2012, 12:40 #25
Цитата Сообщение от SeregaC++ Посмотреть сообщение
Я так сделал:
И сколько раз у тебя будет крутится этот цикл
Цитата Сообщение от SeregaC++ Посмотреть сообщение
for (int cnt = 0; cnt < 10; cnt++)
* * * * * * if (str[i] == str_n[cnt])
при числе 999 999
0
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 12:41  [ТС] #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. Вы, наверное, единственный человек, кто это увидел и в БЛОГЕ, и ЗДЕСЬ
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,252
22.12.2012, 12:41 #27
а как отобразится число 123вася123 ?
0
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 12:45  [ТС] #28
Все эти программы работают достаточно быстро (но моя быстрей в 10 раз, потому что один цикл )
Сложность моей - O(длина строки);
Сложность SeregaC++ - O(длина строки X 10)
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
22.12.2012, 12:47 #29
Цитата Сообщение от sovaz1997 Посмотреть сообщение
O(длина строки X 10
только это как бы равно
Цитата Сообщение от sovaz1997 Посмотреть сообщение
O(Длина строки)
И вообще, зачем вы пишите все эти велосипеды? Попробуйте написать функцию, которая переводит из любого типа в любой(ну или выдает ошибку компиляции, если это невозможно). Она пишется в ~5 строк.
0
sovaz1997
CEO SOVAZ Corp.
380 / 226 / 2
Регистрация: 17.12.2011
Сообщений: 819
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 12:48  [ТС] #30
SeregaC++, зачем ты переделал мою программу в худшую сторону
Цикл внутри цикла удлинит время работы программы на порядок. Чем тебе не нравится сравнение:
C++
1
if(a[i] >= '0' && a[i] <= '9') {tmp = a[i] - '0';}
Вместо этого ты зачем-то вставил цикл...
0
22.12.2012, 12:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 12:48
Привет! Вот еще темы с ответами:

Существует ли метод/функция перевода значения символьной переменной в 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


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

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

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