Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: из char в int  (Прочитано 69925 раз)
0 Пользователей и 1 Гость смотрят эту тему.
scraper
Гость
« : 13-05-2006 21:20 » 

Привет.
Подскажите, пожалуйста:

char *a = "12345";

Как теперь эту строку перевести из char в int, чтобы было число 12345, с которым можно работать.
(Builder - овскую функцию StrToInt не используя).

Спасибо.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #1 : 13-05-2006 21:24 » 

int n=atoi(a);
Записан

scraper
Гость
« Ответ #2 : 13-05-2006 21:30 » 

Спасибо.
Если без использования функций?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #3 : 13-05-2006 21:33 » 

руками - парси циферки... Но чем не устраивает atoi ? Улыбаюсь
Записан

scraper
Гость
« Ответ #4 : 13-05-2006 21:36 » 

Устраивался недавно на работу, прогаммистом_разработчиком-стажером, так задали этот вопрос.
Я не ответил. Сказали через 1.5 мес. повторное собеседование. Боюсь как-бы опять не спросили.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #5 : 13-05-2006 21:44 » 

scraper, ну в случае не дробного положительного десятичного числа: берёшь по очереди цифры, к коду символа прибавляешь 0x30, затем умножаешь на соответствующий вес - 1,10,100,1000 ... и всё суммируешь.
Вот. Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #6 : 13-05-2006 21:47 » 

что-то вроде:
Код:
char *a = "12345";
int Num=0;
for(int i=0;a[i];i++)
{
   Num=Num*10 + a[i]+0x30;
}

Num - число

только тут нет проверки на правильность символов - то есть что символы - цифры

Ну и усложнить для всяких случаев, например - знак минус...
Записан

scraper
Гость
« Ответ #7 : 13-05-2006 21:52 » 

Как расчленить строку, вот не понимаю.
Она же не в масиве.
Есть только начало-адрес этой строки в памяти: *а
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #8 : 13-05-2006 21:56 » 

a[i ]; - работай как с массивом
Записан

scraper
Гость
« Ответ #9 : 13-05-2006 21:58 » 


Сделал:

char *a = "12345";
   int Num=0;
   for(int i=0;a[i];i++)
   {
   Num=Num*10 + a[i]+0x30;
   cout<<Num<<endl;
   }

Выход:
97
1068
10779
107890
1079001

Что-то получилось, но немного не то что хотелось  А черт его знает...


--
(извиняюсь, подправил теги Улыбаюсь (Алексей1153) )
« Последнее редактирование: 14-05-2006 09:55 от Алексей1153 » Записан
scraper
Гость
« Ответ #10 : 13-05-2006 22:00 » 

"a[i ]; - работай как с массивом",
то есть, как с масивом?
Нет масива.
Есть *а.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 14-05-2006 02:02 » 

scraper, Ууууу как всё запущено. Тут брат без учебников не обойтись. Никакие уловки не помогут. И боятся не надо, особенно, если хочешь быть программистом. Дело в том, что в С++ запись [] равносильна записи *. Попробуй записать свой пример

char *a = "12345";

в виде

char a[] = "12345";

Чтобы тебе легче жилось. Ага А вообще-то ты не понимаешь, что значит массив.
Любой кусок памяти можно рассматривать как массив, например массив байт. Или слов и тд. В данном случае это просто кусок памяти, о котором известно следущее:
адерс начала - это твоя *a
размер элементов массива - это твой char

Пример:
Доступ к третьему элементу массива можно записать в приятном для математиков виде, типа a[2], или же в виде а+2*sizeof(char) - эта запись более привычна для программистов тк явно видно что просиход вычисление адреса необходимого элемента относительно начала блока (массива). Это громаднейшее преимущество массивов перед списками. Если в списках нужна итерация, и соответственно пропорционально время получения доступа к необходимому элементу, то в массивах доступ к любому элементу осуществляется простой операцией сложения.

В общем вооружайся Страуструпом и вникай. Иначе ещё многого можешь бояться.

зы Ещё один момент, который тебе надо проработать - перевод чисел из одной системы в другую. Ведь это же элементарно:

1234 = 4*1 + 3*10 + 2*100 + 1*1000

Или?

Небольшая подсказка, как из символа '2' получить цифру 2?
Очень просто - надо от символа '2' отнять символ '0':

int nDig = a[ i ] - '0';

« Последнее редактирование: 19-12-2007 19:13 от Алексей1153++ » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #12 : 14-05-2006 10:00 » 

scraper, а я тупанул Улыбаюсь - код не тестил. Надо отнимать 0x30  , а не прибавлять Улыбаюсь
( '0' == 0x30 )
« Последнее редактирование: 19-12-2007 19:15 от Алексей1153++ » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 14-05-2006 13:16 » 

Лёш, с педагогической точки зрения это было просто замечательно. Я поэтому ничего и не сказал про эту ошибку. Обычно приводимый код предназначен для дополнения к объяснению, а не для тупого копирования. В данном случае он просто скопировал код даже не потрудившись разобраться, что именно он делает. СлабО для программиста-разработчика. Жаль
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
scraper
Гость
« Ответ #14 : 14-05-2006 22:37 » 

Да, спасибо.
А как на первом этапе дать понять компу, сколько символов в строке?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 14-05-2006 23:50 » 

Это большое неудобство массивов. Здесь медицина знает только два способа. 1ый - известно каким символом строка заканчивается, например стандартный символ окончания строки - '\0'. И тогда все функции работают только до этого символа.
Конечно надо следить за тем, чтобы этот символ в строке всё-таки присутствовал. 2ой - всегда передавать точный размер массива. Второй способ более безопасный, хотя и менее удобный.
Вообще работа с массивами требует осторожности и акуратности. Очень легко выйти за пределы своего блока памяти.

Например при

char *a = "12345";

ничто не мешает обратиться к элементу a[200] - компилятор это разрешит. Только последствия будут фатальными. Особенно легко это сделать, если индекс - переменная a[ i ]
« Последнее редактирование: 19-12-2007 19:17 от Алексей1153++ » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines