Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > преобразование типов


Автор: irvis 21.6.2006, 09:24
у меня есть массив символов из него надо получить число.
как?
например:
строка "7899"
мне надо получить число 7899


вот кусок кода из моей програмки
Код

char *str1=new char [k];
for(i=0; i<k; i++)
{
       str1[i]=stroka[i];
}


вот str1 этот массив символов, как мне теперь получить число? 

stroka[i] это вводима строка, она должна быть именно строкой 

Автор: MAKCim 21.6.2006, 09:32
atoi(str1)?

Добавлено @ 09:35 
или самому написать
Код

template<class Return>
    Return convert(const char* str)
{
    Return result=0, k=1;
    for (unsigned int i=strlen(str)-1; i>=0; --i)
        result+=(str[i]-48)*k, k*=10;
    return result;
}
  

Автор: irvis 21.6.2006, 09:43
я не знаю что такое unsigned
и не понимаю (str[i]-48) что за число 48?

 

Автор: MAKCim 21.6.2006, 10:14
Цитата

я не знаю что такое unsigned

книги читай
Цитата

и не понимаю (str[i]-48) что за число 48?

48 - код '0', соответственно str[i]-48 - числовой эквивалент символа из '0'...'9'
 

Автор: irvis 21.6.2006, 10:17
спасибо! 

Автор: Athlon 21.6.2006, 10:23
Цитата

я не знаю что такое unsigned

попробуй перевести с английского  smile 
Цитата

не понимаю (str[i]-48) что за число 48

Как известно в таблице ASCII цифры 0..9 расположены последовательно, число 48 (0х30) - положение нуля в таблице ASCII т.е. строчка
Код

int num(str[i]-48);

инициализирует num номером символа str[i] в таблице ASCII, и чтобы получить значение соответствующей цифры, тебе нужно скоректировать этот номер на 48 (0х30). 

Автор: sergejzr 21.6.2006, 10:28
MAKCim, пиши лучше сразу str[i]-'0'


irvis, вот тебе кусочек кода с проверками и всем, чем нужно smile :

Код

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char *stroka="1234";
  char *end=stroka;
  //здесь само преобразование stroka в res
  int res=strtol(stroka, &end, 10);

  if(*end!=0)
  {
    printf("'%s' не являеься числом! ", stroka );
    return -1;
  }
   printf("'%s' - число '%i'", stroka,res );
   return 0;
}
 

  

Автор: MAKCim 21.6.2006, 17:05
Цитата

пиши лучше сразу str[i]-'0'

разница?  smile  

Автор: sergejzr 21.6.2006, 17:18
1) Вопросов, что такое 48 не возникнет
2) Всё конечно ASCII, но не факт, что везде
3) Логичнее и понятнее, чем запоминать цифры. 

Автор: MAKCim 21.6.2006, 17:23
sergej.z
учту  smile  

Автор: EvgenZ 16.9.2006, 16:28
А как лучше сделать, чтобы char содержащий двоичное число (101010101001) можно было инрементировать, складывать и т.д. Переводить его в инт, делать что-то и опять перводить в char?

Автор: SparF 16.9.2006, 16:38
Очень удобно в этом случае использовать функции sscanf() и sprintf()
один из самых больших плюсов - предоставляемые ими шаблоны форматной строки.

Автор: EvgenZ 16.9.2006, 16:45
SparF,  smile  непонимаю про что ты. Если можно напиши примерчик.

Автор: SparF 16.9.2006, 16:53
Example.

Код

/* sscanf example */
#include <stdio.h>

int main ()
{
  char sentence []="Benny is 29 years old";
  char str [20];
  int i;

  sscanf (sentence,"%s %*s %d",str,&i);
  printf ("%s -> %d\n",str,i);
  
  return 0;
}


Output:
Benny -> 29 

Если признаться, то самому было влом писать, пример взят из 
http://www.cplusplus.com/ref/cstdio/sscanf.html

sprintf() работает также как и обычный printf(), только вывод - в строку

Автор: EvgenZ 16.9.2006, 16:58
хм насколько я понял получается тотже atoi (перевод из char в int) ? Или я не понял соли?

Автор: SparF 16.9.2006, 17:11
Цитата

получается тотже atoi (перевод из char в int) 


Только с более широкими возможностями:
+ сама строка может включать не только цифры, а может быть абс любой строкой - применяй ты atoi в вышеизложенном примере - пришлось бы сначала из длинной строки "Benny is 29 years old" выделить "29"
+ именяется формат входных данных - форматную строку переписал и забыл ), а в случае с atoi придется повозиться с кодом выделения подстроки ("29" в нашем случае) - тоже ничего сложного, но все же лишний труд и лишние ошибки)
* в случае, когда работаешь уже с выделенной подстрокой и надо взять только одно значение, то разница, конечно, теряется.....
*кроме того переводить не обязательно только в int (сходи по ссылке, которую я указал, там полное описание smile )
 smile 

Автор: EvgenZ 16.9.2006, 18:05
Я заходил, спасбио за полезную и интеерсную информацию, но в данном конкретном случае нужен С++. Что-то я похоже передумал сегодня не могу понять работу itoa:   
char num[10];
std::cout << "vvedi dvoi4noe 4islo\n";
std::cin >> num;
int n = atoi(num);
n+=5;
num = itoa(int XXX, char* YYY, int ZZZ); // ??? вот тут не догоняю, как назад в чар забахать? что такое ХХХ YYY ZZZ ?

Автор: Daevaorn 16.9.2006, 18:42
Цитата(EvgenZ @  16.9.2006,  19:05 Найти цитируемый пост)
но в данном конкретном случае нужен С++.

С++, так С++:
Код

template< typename Target, typename Source >
Target type_cast( const Source& src )
{
    std::strstream stream;
    stream << src;
    Target result;
    stream >> result;
    if( !stream.eof() )
        throw std::logic_error( "bad cast" );
    return result;
}

Автор: EvgenZ 16.9.2006, 19:29
а можно с помощью itoa объяснить? 

Автор: Romikgy 16.9.2006, 19:39
Цитата(EvgenZ @  16.9.2006,  17:05 Найти цитируемый пост)
num = itoa(int XXX, char* YYY, int ZZZ); // ??? вот тут не догоняю, как назад в чар забахать? что такое ХХХ YYY ZZZ ?

http://www.codenet.ru/progr/cpp/spru/itoa.php

Автор: EvgenZ 16.9.2006, 19:45
Всем огомное спасибо, поставьте пожалуйста  Daevaorn, и Romikgy,   +  smile 
 

Автор: Romikgy 16.9.2006, 19:50
EvgenZ, поднимишся выше 100 постов, сам поставишь если не забудешь smile 
Удачи в программировании smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)