Здраствуйте, _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);
Я не совсем правильно задал вопрос... Во-первых мне нужно на Си, а во вторых без использования функций форматного вводв,вывода...
Просто интересно, как, например, реализована та же функция sprintf()?
Здравствуйте, _chill, Вы писали:
_>Я не совсем правильно задал вопрос... Во-первых мне нужно на Си, а во вторых без использования функций форматного вводв,вывода... _>Просто интересно, как, например, реализована та же функция sprintf()?
Ну так Begun Ulad уже ответил: atoi и itoa и аналогичные функции для дробных чисел — по перекрестным ссылкам в хелпе найдешь.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, _chill, Вы писали:
_>>Я не совсем правильно задал вопрос... Во-первых мне нужно на Си, а во вторых без использования функций форматного вводв,вывода... _>>Просто интересно, как, например, реализована та же функция sprintf()? LVV>Ну так Begun Ulad уже ответил: atoi и itoa и аналогичные функции для дробных чисел — по перекрестным ссылкам в хелпе найдешь.
Да нет же... жти функции я знаю...
Вообще тока стандартными конструкциями языка, без спец. функций...
Здравствуйте, _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;
}
Здравствуйте, _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';