Получить из строки число и наоборот.
От: _chill Россия  
Дата: 08.01.04 22:16
Оценка:
Как преобразовать строку в число ("123" — 123 и 123 — "123") без использования функций sprintf(...) и sscanf(...)?
Re: Получить из строки число и наоборот.
От: Unix  
Дата: 09.01.04 01:17
Оценка:
Здравствуйте, _chill, Вы писали:

_>Как преобразовать строку в число ("123" — 123 и 123 — "123") без использования функций sprintf(...) и sscanf(...)?


Число в строку:

int a;
CString str;
str.Format("%d",a);
Re: Получить из строки число и наоборот.
От: Begun Ulad Беларусь  
Дата: 09.01.04 01:21
Оценка:
Здравствуйте, _chill, Вы писали:

_>Как преобразовать строку в число ("123" — 123 и 123 — "123") без использования функций sprintf(...) и sscanf(...)?


_itoa() (Integer To String)
atoi() (String To Integer)
и все функции этого семейства (_itot, _itow and so on) здесь и здесь
// test of atoi
    s = "  -9885";
  i = atoi( s );
... << RSDN@Home 1.1.2 beta 2 >>
\n Give me MSDN and I'll show you the world
Re: Получить из строки число и наоборот.
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 09.01.04 05:19
Оценка: 12 (1)
Здравствуйте, _chill, Вы писали:

_>Как преобразовать строку в число ("123" — 123 и 123 — "123") без использования функций sprintf(...) и sscanf(...)?



#include <string>
#include <sstream>
#include <iostream>

template <class T>
bool from_string(T &t, 
                 const std::string &s, 
                 std::ios_base & (*f)(std::ios_base&))
{
   std::istringstream iss(s);
   return !(iss>>f>>t).fail();
}

int main()
{
   int i;
   float f;
   // the third parameter of from_string() should be 
   // one of std::hex, std::dec or std::oct
   if(from_string<int>(i, std::string("ff"), std::hex)){
      std::cout<<i<<std::endl;
   }
   else{
      std::cout<<"from_string failed"<<std::endl;
   }
   if(from_string<float>(f, 
                               std::string("123.456"),
                               std::dec))
   {
      std::cout<<f<<std::endl;
   }
   else{
      std::cout<<"from_string failed"<<std::endl;
   }
   return 0;
} 

/* output:
255
123.456
*/



#include <string>
#include <sstream>
#include <iostream>

template <class T>
std::string to_string(T t, std::ios_base & (*f)(std::ios_base&))
{
   std::ostringstream oss;
   oss << f << t;
   return oss.str();
}

int main()
{
   // the second parameter of to_string() should be one of 
   // std::hex, std::dec or std::oct
   std::cout<<to_string<long>(123456, std::hex)<<std::endl;
   std::cout<<to_string<long>(123456, std::oct)<<std::endl;
   return 0;
} 

/* output:
1e240
361100
*/
Re: Получить из строки число и наоборот.
От: PM  
Дата: 09.01.04 07:48
Оценка: 2 (1)
Здраствуйте, _chill. Вы писали:

c> Как преобразовать строку в число ("123" — 123 и 123 — "123") без

c> использования функций sprintf(...) и sscanf(...)?
#include <boost/lexical_cast.hpp>
int n = 123;
std::string s = boost::lexical_cast<std::string>(n);
int m = boost::lexical_cast<int>(s);
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[2]: Получить из строки число и наоборот.
От: _chill Россия  
Дата: 09.01.04 11:52
Оценка:
Я не совсем правильно задал вопрос... Во-первых мне нужно на Си, а во вторых без использования функций форматного вводв,вывода...
Просто интересно, как, например, реализована та же функция sprintf()?
Re[3]: Получить из строки число и наоборот.
От: LaptevVV Россия  
Дата: 09.01.04 11:54
Оценка:
Здравствуйте, _chill, Вы писали:

_>Я не совсем правильно задал вопрос... Во-первых мне нужно на Си, а во вторых без использования функций форматного вводв,вывода...

_>Просто интересно, как, например, реализована та же функция sprintf()?
Ну так Begun Ulad уже ответил: atoi и itoa и аналогичные функции для дробных чисел — по перекрестным ссылкам в хелпе найдешь.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Получить из строки число и наоборот.
От: Шахтер Интернет  
Дата: 09.01.04 19:32
Оценка: 8 (1)
Здравствуйте, _chill, Вы писали:

_>Как преобразовать строку в число ("123" — 123 и 123 — "123") без использования функций sprintf(...) и sscanf(...)?


Вот так, например.

/* main.cpp */ 

/* class StringFromInt */ 

class StringFromInt
 {
   static const size_t BufSize=32; // sufficient for 64-bit arithmetic
 
   char buf[BufSize];
   char *pt;
   
   void put(char c) { *(--pt)=c; }
   
   void format(unsigned x);
   
   // copy disabled
   
   StringFromInt(const StringFromInt &) {}
   
   void operator = (const StringFromInt &) {}
   
  public: 
  
   explicit StringFromInt(int val);
  
   operator const char * () const { return pt; }
 };

void StringFromInt::format(unsigned x)
 {
  if( x )
    {
     for(; x ;x/=10) put("0123456789"[x%10]);
    }
  else
    put('0');  
 }

StringFromInt::StringFromInt(int val) : pt(buf+BufSize)
 {
  put(0);
  
  if( val<0 ) 
    {
     format(-val);
     put('-');
    }
  else
    format(val);  
 }
 
/* class DecValue */  

class DecValue
 {
   static const size_t TableSize=256; // assume char is an 8-bit type
 
   signed char table[TableSize]; 
 
  public:
  
   DecValue();
   
   int operator () (unsigned char c) { return table[c]; }
 };
 
DecValue::DecValue()
 {
  for(signed char *pt=table,*lim=pt+TableSize; pt<lim ;pt++) *pt=-1;
  
  signed char v=0;
  unsigned char c;
  
  for(const char *s="0123456789"; (c=*s)!=0 ;v++,s++) table[c]=v;
 }

/* class IntFromString */ 

#include <exception>

class IntFromString
 {
   int val;
   
   static DecValue TableFun;
   
   static int Parse_uns(const char *s);
   
  public:
  
   explicit IntFromString(const char *);
   
   operator int() const { return val; }
 }; 

DecValue IntFromString::TableFun;

int IntFromString::Parse_uns(const char *s)
 {
  int v=TableFun(*s);
  
  if( v<0 ) throw std::exception("no digits");
  
  int ret=0;
  
  do
    {
     ret=10*ret+v;
    }
  while( (v=TableFun(*(++s)))>=0 );  
  
  return ret;
 }
 
IntFromString::IntFromString(const char *s)
 {
  if( !s ) throw std::exception("empty string");
 
  switch( *s )
    {
     case '-' : val=-Parse_uns(s+1); break;
     
     case '+' : s++; default: val=Parse_uns(s);
    }
 }

/* main() */ 

#include <iostream> 

using namespace std;

int main()
 {
  cout << StringFromInt(12345) << '\n' 
       << StringFromInt(-12345) << '\n'
       << StringFromInt(0) << '\n' ;
       
  cout << IntFromString("1234567890") << '\n'
       << IntFromString("+1234567890") << '\n'
       << IntFromString("-1234567890") << '\n'
       << IntFromString("0") << '\n' ;
 
  return 0;
 }
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[4]: Получить из строки число и наоборот.
От: _chill Россия  
Дата: 09.01.04 21:50
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, _chill, Вы писали:


_>>Я не совсем правильно задал вопрос... Во-первых мне нужно на Си, а во вторых без использования функций форматного вводв,вывода...

_>>Просто интересно, как, например, реализована та же функция sprintf()?
LVV>Ну так Begun Ulad уже ответил: atoi и itoa и аналогичные функции для дробных чисел — по перекрестным ссылкам в хелпе найдешь.

Да нет же... жти функции я знаю...
Вообще тока стандартными конструкциями языка, без спец. функций...
Re[5]: Получить из строки число и наоборот.
От: Begun Ulad Беларусь  
Дата: 10.01.04 02:07
Оценка:
Здравствуйте, _chill, Вы писали:

_>Здравствуйте, LaptevVV, Вы писали:


LVV>>Здравствуйте, _chill, Вы писали:


_>>>Я не совсем правильно задал вопрос... Во-первых мне нужно на Си, а во вторых без использования функций форматного вводв,вывода...

_>>>Просто интересно, как, например, реализована та же функция sprintf()?
LVV>>Ну так Begun Ulad уже ответил: atoi и itoa и аналогичные функции для дробных чисел — по перекрестным ссылкам в хелпе найдешь.

_>Да нет же... жти функции я знаю...

_>Вообще тока стандартными конструкциями языка, без спец. функций...

copyright (c) Microsoft

atox.c

/***
*long atol(char *nptr) - Convert string to long
*
*Purpose:
*       Converts ASCII string pointed to by nptr to binary.
*       Overflow is not detected.
*
*Entry:
*       nptr = ptr to string to convert
*
*Exit:
*       return long int value of the string
*
*Exceptions:
*       None - overflow is not detected.
*
*******************************************************************************/

long __cdecl _tstol(
        const _TCHAR *nptr
        )
{
        int c;              /* current char */
        long total;         /* current total */
        int sign;           /* if '-', then negative, otherwise positive */
#if defined (_MT) && !defined (_UNICODE)
        pthreadlocinfo ptloci = _getptd()->ptlocinfo;

        if ( ptloci != __ptlocinfo )
            ptloci = __updatetlocinfo();

        /* skip whitespace */
        while ( __isspace_mt(ptloci, (int)(_TUCHAR)*nptr) )
#else  /* defined (_MT) && !defined (_UNICODE) */
        while ( _istspace((int)(_TUCHAR)*nptr) )
#endif  /* defined (_MT) && !defined (_UNICODE) */
            ++nptr;

        c = (int)(_TUCHAR)*nptr++;
        sign = c;           /* save sign indication */
        if (c == _T('-') || c == _T('+'))
            c = (int)(_TUCHAR)*nptr++;    /* skip sign */

        total = 0;

        while ( (c = _tchartodigit(c)) != -1 ) {
            total = 10 * total + c;     /* accumulate digit */
            c = (_TUCHAR)*nptr++;    /* get next char */
        }

        if (sign == '-')
            return -total;
        else
            return total;   /* return result, negated if necessary */
}


_itoa
xtoa.c
/***
*char *_itoa, *_ltoa, *_ultoa(val, buf, radix) - convert binary int to ASCII
*       string
*
*Purpose:
*       Converts an int to a character string.
*
*Entry:
*       val - number to be converted (int, long or unsigned long)
*       int radix - base to convert into
*       char *buf - ptr to buffer to place result
*
*Exit:
*       fills in space pointed to by buf with string result
*       returns a pointer to this buffer
*
*Exceptions:
*
*******************************************************************************/

/* helper routine that does the main job. */

static void __cdecl xtoa (
        unsigned long val,
        char *buf,
        unsigned radix,
        int is_neg
        )
{
        char *p;                /* pointer to traverse string */
        char *firstdig;         /* pointer to first digit */
        char temp;              /* temp char */
        unsigned digval;        /* value of digit */

        p = buf;

        if (is_neg) {
            /* negative, so output '-' and negate */
            *p++ = '-';
            val = (unsigned long)(-(long)val);
        }

        firstdig = p;           /* save pointer to first digit */

        do {
            digval = (unsigned) (val % radix);
            val /= radix;       /* get next digit */

            /* convert to ascii and store */
            if (digval > 9)
                *p++ = (char) (digval - 10 + 'a');  /* a letter */
            else
                *p++ = (char) (digval + '0');       /* a digit */
        } while (val > 0);

        /* We now have the digit of the number in the buffer, but in reverse
           order.  Thus we reverse them now. */

        *p-- = '\0';            /* terminate string; p points to last digit */

        do {
            temp = *p;
            *p = *firstdig;
            *firstdig = temp;   /* swap *p and *firstdig */
            --p;
            ++firstdig;         /* advance to next two digits */
        } while (firstdig < p); /* repeat until halfway */
}

/* Actual functions just call conversion helper with neg flag set correctly,
   and return pointer to buffer. */

char * __cdecl _itoa (
        int val,
        char *buf,
        int radix
        )
{
        if (radix == 10 && val < 0)
            xtoa((unsigned long)val, buf, radix, 1);
        else
            xtoa((unsigned long)(unsigned int)val, buf, radix, 0);
        return buf;
}
... << RSDN@Home 1.1.2 beta 2 >>
\n Give me MSDN and I'll show you the world
Re[5]: Получить из строки число и наоборот.
От: Socrat Россия  
Дата: 10.01.04 07:07
Оценка:
Здравствуйте, _chill, Вы писали:

_>Здравствуйте, LaptevVV, Вы писали:


LVV>>Здравствуйте, _chill, Вы писали:


_>>>Я не совсем правильно задал вопрос... Во-первых мне нужно на Си, а во вторых без использования функций форматного вводв,вывода...

_>>>Просто интересно, как, например, реализована та же функция sprintf()?
LVV>>Ну так Begun Ulad уже ответил: atoi и itoa и аналогичные функции для дробных чисел — по перекрестным ссылкам в хелпе найдешь.

_>Да нет же... жти функции я знаю...

_>Вообще тока стандартными конструкциями языка, без спец. функций...


Число num в строку:

int num = 100;          // исходное число
char str [LEN];         // строка с результатом
for (int i = LEN; num != 0; num /= 10)
    str [--i] = num % 10 + '0';


После цикла строка с числом начинается с str[i].
Обратно:


char str [LEN] = "100";
int num = 0;
for (int i = 0; isdigit (str [i]); i++)
    num = num * 10 + str [i] - '0';
Re: Получить из строки число и наоборот.
От: Zuka Россия  
Дата: 13.01.04 17:22
Оценка:
Здравствуйте, _chill, Вы писали:

C>Как преобразовать строку в число ("123" — 123 и 123 — "123") без использования функций sprintf(...) и sscanf(...)?


Example
// num_put_put.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <sstream>
using namespace std;
int main( )
{
   locale loc( "german_germany" );
   basic_stringstream<char> psz2;
   ios_base::iostate st = 0;
   long double fVal;
   cout << "The thousands separator is: " 
        << use_facet < numpunct <char> >(loc).thousands_sep( ) 
        << endl;

   psz2.imbue( loc );
   use_facet < num_put < char > >
      ( loc ).put(basic_ostream<char>::_Iter(psz2.rdbuf( ) ),
                    psz2, st, fVal=1000.67);

   if ( st & ios_base::failbit )
      cout << "num_put( ) FAILED" << endl;
   else
      cout << "num_put( ) = " << psz2.rdbuf( )->str( ) << endl;
}

Output
The thousands separator is: .
num_put( ) = 1000,67

(C) by MSDN
... << RSDN@Home 1.0 beta 4 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.