forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   String to int (http://forum.boolean.name/showthread.php?t=18339)

Nikich 09.07.2013 15:44

String to int
 
Какой самый простой способ данного приведения типов? На ум пришла данная функция:
Код:

int stringToInt(string s,int n)
{
    return (n==0) ? s[n]-'0' : ((s[n]-'0')+10*stringToInt(s,n-1));
}

Можно ли ещё упростить?
В интернете читал о разных стандартных функциях, однако по ответам заметил, что многие из них не(корректно) работают. Поэтому интересуют максимально простые самостоятельные решения, либо те, что точно работают в большинстве стандартных компиляторов.

h1dd3n 09.07.2013 15:49

Ответ: String to int
 
http://www.cplusplus.com/reference/cstdlib/strtol/

Nikich 09.07.2013 15:54

Ответ: String to int
 
Nope, не работает с самой строкой, только что проверял. Только если переводить из string в char, но как-то много переводов.

SBJoker 09.07.2013 16:45

Ответ: String to int
 
кроме того есть atoi() и прочие

эм, string.c_str() много переводов? Тупо указатель на кидает на внутренний чар массив.

HolyDel 09.07.2013 20:40

Ответ: String to int
 
в С++0x есть некий std::to_string.
2012 студия его держит

pozitiffcat 12.07.2013 15:52

Ответ: String to int
 
всю жизнб atoi() юзал проблем не имел

impersonalis 18.07.2013 02:02

Ответ: String to int
 
можно и самому реализовать (люблю давать подобное задание студентам).
сам тоже обычно юзаю atoi, хоть это и не стандартная функция (если только уже не стала)

pozitiffcat 18.07.2013 11:29

Ответ: String to int
 
Цитата:

Сообщение от impersonalis (Сообщение 263693)
можно и самому реализовать (люблю давать подобное задание студентам).
сам тоже обычно юзаю atoi, хоть это и не стандартная функция (если только уже не стала)

а как ты сам реализовываешь? бежишь по char и вычисляешь из кода символа? Можешь дать пример, как наиболее шустро сконвертировать. По твоему опыту так сказать.

impersonalis 18.07.2013 12:02

Ответ: String to int
 
Нуу, например:
Код:

int L=strlen(str)-1;
    bool Minus=(str[0]=='-');
    int S=0;
    for(int i=L,mul=1;i>=Minus;i--,mul*=10)
        S+=((str[i]-48)*mul);
    S*=1-2*Minus;

Студентам могут попасться дополнительные детали: наличие буквенного мусора в числе, формальных знаков в начале (+) и т.п. Т.е. можно придумать оптимизацию под конкретику (тот же 1-2* вполне можно заменить тернарной конструкцией). Наиболее распростраённые промахи:
1) перебор от начала к концу строки: придётся посчитать тяжёлый множитель через pow, который на каждой итерации ещё и делить на 10 (хотя умножение - при движении в другую сторону - будет быстрее);
2) неиспользование прошлых результатов: вычисление множителя через pow на каждой итерации.
Или вот задание:
генерировать имена файлов типа
file000.bmp,file001.bmp...
Некоторые тоже через itoa фигачат, каждую итерацию теребя дополнительные буферы и делая стркаты, хотя это можно сделать простой манипуляцией, переделывая один буфер.

pozitiffcat 18.07.2013 13:21

Ответ: String to int
 
Цитата:

Сообщение от impersonalis (Сообщение 263718)
Нуу, например:
Код:

int L=strlen(str)-1;
    bool Minus=(str[0]=='-');
    int S=0;
    for(int i=L,mul=1;i>=Minus;i--,mul*=10)
        S+=((str[i]-48)*mul);
    S*=1-2*Minus;


спс, примерно так и представлял реализацию ))

Platon 18.07.2013 14:35

Ответ: String to int
 
Цитата:

Сообщение от impersonalis (Сообщение 263718)
Код:

int L=strlen(str)-1;
    bool Minus=(str[0]=='-');
    int S=0;
    for(int i=L,mul=1;i>=Minus;i--,mul*=10)
        S+=((str[i]-48)*mul);
    S*=1-2*Minus;


Зачем там strlen, двойное умножение и странное отрицание в конце? Проще надо быть:
Код:

int simple_atoi ( const char *str )
{
        int v = 0;
       
        const bool neg = ( str[ 0 ] == '-' );
       
        for( int i = neg ? 1 : 0; str[ i ] != 0; ++i )
        {
                v *= 10;
               
                v += ( str[ i ] - '0' );
        }
       
        return( neg ? -v : v );
}

но лучше не городить велосипеды и юзать стандартные.

HolyDel 18.07.2013 14:38

Ответ: String to int
 
Код:

int L=strlen(str)-1;
    bool Minus=(str[0]=='-');
    int S=0;
    for(int i=L,mul=1;i>=Minus;i--,mul*=10)
        S+=((str[i]-48)*mul);
    S*=1-2*Minus;

не читабельно. особенно вот это: for(int i=L,mul=1;i>=Minus;i--,mul*=10)
можно i вообще выкинуть.
for(int mul=1;L>=Minus;L--,mul*=10)

хотя читабельность много важнее минимально числа строчек. я бы вообще написал как-то так:

Код:

int L=strlen(str)-1;
bool Minus=(str[0]=='-');
int S=0, mul = 1, first_number = Minus?1:0;

while(L>first_number)
{
        S+=((str[L]-'0')*mul);
        --L;
        mul *= 10;
}

if(minus)
        S = -S;

да, тут есть по сути лишние строчки, типа first_number = Minus?1:0. которые делают совершенно лишнюю работу. но, если это не глубоко в ядре, то читабельность важнее.

Platon опередил. вот его вариант в разы читабельне, имхо.

impersonalis 19.07.2013 13:53

Ответ: String to int
 
Вложений: 1
Цитата:

Сообщение от Platon (Сообщение 263738)
Зачем там strlen, двойное умножение и странное отрицание в конце? Проще надо быть:
....

Цитата:

Сообщение от HolyDel (Сообщение 263740)
...
не читабельно. особенно вот это: ... я бы вообще написал как-то так:

...

Platon опередил. вот его вариант в разы читабельне, имхо.

ну как всегда:
Вложение 19380

:)


Часовой пояс GMT +4, время: 02:58.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot