Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 09.07.2013, 15:44   #1
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
String to int

Какой самый простой способ данного приведения типов? На ум пришла данная функция:
int stringToInt(string s,int n)
{
    return (n==0) ? s[n]-'0' : ((s[n]-'0')+10*stringToInt(s,n-1));
}
Можно ли ещё упростить?
В интернете читал о разных стандартных функциях, однако по ответам заметил, что многие из них не(корректно) работают. Поэтому интересуют максимально простые самостоятельные решения, либо те, что точно работают в большинстве стандартных компиляторов.
(Offline)
 
Ответить с цитированием
Старый 09.07.2013, 15:49   #2
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: String to int

http://www.cplusplus.com/reference/cstdlib/strtol/
__________________
(Offline)
 
Ответить с цитированием
Старый 09.07.2013, 15:54   #3
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: String to int

Nope, не работает с самой строкой, только что проверял. Только если переводить из string в char, но как-то много переводов.
(Offline)
 
Ответить с цитированием
Старый 09.07.2013, 16:45   #4
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: String to int

кроме того есть atoi() и прочие

эм, string.c_str() много переводов? Тупо указатель на кидает на внутренний чар массив.
__________________
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
impersonalis (18.07.2013), Nikich (09.07.2013)
Старый 09.07.2013, 20:40   #5
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: String to int

в С++0x есть некий std::to_string.
2012 студия его держит
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nikich (09.07.2013)
Старый 12.07.2013, 15:52   #6
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: String to int

всю жизнб atoi() юзал проблем не имел
(Offline)
 
Ответить с цитированием
Старый 18.07.2013, 02:02   #7
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: String to int

можно и самому реализовать (люблю давать подобное задание студентам).
сам тоже обычно юзаю atoi, хоть это и не стандартная функция (если только уже не стала)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pozitiffcat (18.07.2013)
Старый 18.07.2013, 11:29   #8
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: String to int

Сообщение от impersonalis Посмотреть сообщение
можно и самому реализовать (люблю давать подобное задание студентам).
сам тоже обычно юзаю atoi, хоть это и не стандартная функция (если только уже не стала)
а как ты сам реализовываешь? бежишь по char и вычисляешь из кода символа? Можешь дать пример, как наиболее шустро сконвертировать. По твоему опыту так сказать.
(Offline)
 
Ответить с цитированием
Старый 18.07.2013, 12:02   #9
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: 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 фигачат, каждую итерацию теребя дополнительные буферы и делая стркаты, хотя это можно сделать простой манипуляцией, переделывая один буфер.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pozitiffcat (18.07.2013)
Старый 18.07.2013, 13:21   #10
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: String to int

Сообщение от impersonalis Посмотреть сообщение
Нуу, например:
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;
спс, примерно так и представлял реализацию ))
(Offline)
 
Ответить с цитированием
Старый 18.07.2013, 14:35   #11
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Ответ: String to int

Сообщение от impersonalis Посмотреть сообщение
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 );
}
но лучше не городить велосипеды и юзать стандартные.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (18.07.2013)
Старый 18.07.2013, 14:38   #12
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: 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 опередил. вот его вариант в разы читабельне, имхо.
(Offline)
 
Ответить с цитированием
Старый 19.07.2013, 13:53   #13
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: String to int

Сообщение от Platon Посмотреть сообщение
Зачем там strlen, двойное умножение и странное отрицание в конце? Проще надо быть:
....
Сообщение от HolyDel Посмотреть сообщение
...
не читабельно. особенно вот это: ... я бы вообще написал как-то так:

...

Platon опередил. вот его вариант в разы читабельне, имхо.
ну как всегда:
Нажмите на изображение для увеличения
Название: iak2ezuPW1c.jpg
Просмотров: 872
Размер:	44.7 Кб
ID:	19380

__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com