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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Структура «Железнодорожный состав» http://www.cyberforum.ru/cpp-beginners/thread741289.html
Создайте консольное приложение для решения задачи С++ Структура «Железнодорожный состав» с полями "номер поезда", "количество вагонов", "модель вагонов" (в одном составе используются вагоны одной модели). Бизнес-функция: расчёт длины состава по длине вагона для определенной модели (табл.). Модель вагона 10-4022 10-475 11-066 11-1709 11-1759
C++ Виртуальные функции Можете привести пример виртуальной функции с использованием ссылок? http://www.cyberforum.ru/cpp-beginners/thread741278.html
C++ Структура «Железнодорожный состав»
Структура «Железнодорожный состав» с полями "номер поезда", "количество вагонов", "модель вагонов" (в одном составе используются вагоны одной модели). Бизнес-функция: расчёт длины состава по длине вагона для определенной модели (табл.). Модель вагона Длина вагона(в м.) 10-4022 117,2 1--475 116,3 11-066 147,2 11-1709 ...
Другие виды списков C++
Помогите найти и исправить ошибку в задачке В текстовом файле заданы действительные числа. Выбрать из него убывающую последовательность наибольшей длины и вывести ее на экран. Если таких последовательностей несколько, то вывести их все в отдельной строке каждую. Для заполнения убывающих последовательностей формировать массив очередей, хранить для каждой очереди длину ее (количество...
C++ Наибольшее из трех чисел http://www.cyberforum.ru/cpp-beginners/thread741266.html
Составить функцию, которая получает три аргумента х, y, и z, и возвращает как результат наибольшее из х,y,z.
C++ Заменить каждую из групп точек одной точкой Ввести строку. Создать функцию, позволяющую заменить в заданной строке каждую из групп стоящих рядом точек одной точкой. Если знака <<.>> нет в строке, то вывести сообщение об етом.(использовать указатели). подробнее

Показать сообщение отдельно
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
22.12.2012, 23:13     Моя реализация функции перевода string в int
Вот писал на чистом Си(не С99)

<ctype.h> не юзал.
Только функции ввода/вывода.
<stdlib.h> для system();

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdio.h>
#include <stdlib.h>
 
long strtol (char *, char **, int );
double pow (double , int );
 
#define isdigit(a) ((a) >= '0' && (a) <= '9') 
#define tolower(a) ((a) >= 'A' && (a) <= 'Z' ? (a) - 'A' + 'a' : (a)  )
#define isalpha(a) ( ((a) >= 'A' && (a) <= 'Z') || ((a) >= 'a' && (a) <= 'z')  ? (a) : 0 )
 
int main (void)
{
    char s[] = "021 10x 0xff";
    char *p;
 
    printf ("%ld\n", strtol (s, &p, 8) );
    printf ("%ld\n", strtol ("101", &p, 2) );
    printf ("%ld\n", strtol ("125", &p, 10) );
    printf ("%ld\n", strtol ("0x5Ab", &p, 16) );
    printf ("%ld\n", strtol ("5Ab", &p, 16) );
    system ("pause");
    return 0;
}
 
long strtol (char *s, char **end, int base)
{
    long res = 0L;
    char *p;
    int exp;
 
    if ( s && *s )
    {
        for ( ; *s && !isdigit(*s) && !isalpha (*s) ; ++s )
            ;
        for ( *end = s ; **end && **end - '0' < base && isdigit (**end) ; ++*end ) 
            ;
    }
    else 
    {
        *end = NULL;
        return res;
    }
 
    if ( base )
        if ( base >= 2 && base <= 36 ) 
        {
            if ( base > 10 ) // dvigaen *end do konca
                for ( ; **end && tolower(**end) - 'a' + 10 < base && isalpha(**end) ; ++**end )
                    ;
            //Run
            for ( p = *end - 1, exp = 0 ; p != (s - 1) ; --p )
                res +=  (isalpha (*p) ? tolower(*p) - 'a' + 10 : *p - '0') * (long) pow ( (double) base, exp++ );// Zde
        }
        else
        {
            // ERROR ret 0L
        }
    else
    {
        //Standart 0x 1123 
        // else ret 0L 
        if ( tolower(*(s + 1)) == 'x' ) // !!!!!!!!!!!WRONG!!!!!!!!!!
            res = strtol ( s + 2, end, 16 );                
    }
    return res;
}
 
double pow( double base, int exp )
{
    size_t i;
    double res = 1;
 
    if ( exp < 0 )
        res = pow ( 1 / base , -1 * exp );
    else
    {
        for ( i = 0 ; i < (size_t) exp ; ++i )
            res *= base;
    }
    return res;
}
Согласен вариант не очень, но писалась давно нет желания допиливать.
Если будут конфликтовать идентификаторы, то либо компилить с другими ключами, либо добавить макросы.
 
Текущее время: 18:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru