LINUX.ORG.RU

что использовать для linux вместо itoa() ?


0

0

Мне нужно переменную int записать в текстовый файл и потом считать из него. Под винду я бы просто вызвал itoa, потом fputs, чтобы положить значение в файл, затем fgets - чтобы считать. Под линукс itoa нет. Что использовать вместо? Или как обойтись без таких преобразований? Или где взять исходник функции?

anonymous

Ответ на: комментарий от signal11

> snprintf

Ну а если в файл, то и fprintf()

Или на C++ в stream.

anonymous
()

/*Att! NOT thread safety!*/
/*Only for 32-bit integers: 32/Log_2[10]=9.63:*/
static char buf[12];
char *itoa(int i)
{
char *ptr = buf + sizeof(buf) - 1;
unsigned int u;
int minus = 0;

   if (i < 0) {
      minus = 1;
      u = ((unsigned int)(-(1+i))) + 1;
   }else
      u = i;
      *ptr = 0;
   do
      *--ptr = '0' + (u % 10);
   while(u/=10);

   if (minus)
      *--ptr = '-';
   return ptr;
}

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> /*Att! NOT thread safety!*/
> /*Only for 32-bit integers: 32/Log_2[10]=9.63:*/

wow! I probably should plug it to my new super-portable LIBC ;-)

А если серьезно, то я не понимаю какая цель преседовалась этим
кодом. Скорость?

signal11
()

Сенкс 2 all! Разобрался ещё вчера приблизительно таким макаром:

char str[16]; int i = 10; sprintf(str,"%i",i);

anonymous
()
Ответ на: комментарий от signal11

На собеседовании могут попросить написать реализацию itoa, например в Microsoft :))

так что постите свои реализации :)

anonymous
()
Ответ на: комментарий от anonymous

> char str[16]; int i = 10; sprintf(str,"%i",i);

А вот теперь убери эту бяку и никому больше не показывай (кроме Альфекса =). И почитай man snprintf...

int19h ★★★★
()
Ответ на: комментарий от signal11

signal11 :

> А если серьезно, то я не понимаю какая цель преседовалась этим
> кодом. Скорость?

В смысле?

Простейший код, преобразующий целое в строку; корректно обрабатывает
MIN_INT.

sprintf хреноват по причине тормознутости, я это на своей
шкуре испытал (ИНОГДА бывает нужен ОЧЕНЬ быстрый конвертор).

Кстати, вот пример более портабильного кода:

static char integers[10]={'0','1','2','3','4','5','6','7','8','9'};
/*converts long to a string representation and returns it:*/
char *long2str(char *buf, long n)
{
char tmp[22];/* This is a stack. 
               64/Log_2[10] = 19.3, so this is enough forever...*/
unsigned long u;
char *bufptr=buf, *tmpptr=tmp+1;

   if(n<0){/*Swap the sign and store '-':*/
      /*INT_MIN workaround:*/
      u = ((unsigned long)(-(1+n))) + 1;
      *bufptr++='-';
   }else
       u=n;

   *tmp='\0';/*terminator*/

   /*Fill up the stack:*/
   do
     *tmpptr++=integers[u%10];
   while(u/=10);

   /*Copy the stack to the output buffer:*/
   while( (*bufptr++ = *--tmpptr)!='\0' );
   return buf;
}/*long2str*/

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Вообще более правильный _портабельный_ код должен бы отслеживать размер используемого буфера и при необходимости вызывать malloc/alloca =)

int19h ★★★★
()
Ответ на: комментарий от int19h

int19h (03.12.2004 15:22:04):

> ... _портабельный_ код ...

Никогда не думал, что в русском языке есть слова "портАбельный" и "портабИльный". ИМХО ;) все же "переносимый".

> должен бы отслеживать размер используемого буфера и при необходимости вызывать malloc/alloca

Угу, а еще следить за границами массивов и переполнением стэка.

Нет уж, я, как-нибудь, сам за этим прослежу. Если уж приспичило, можно враппер (или "_вроппер_"? :)) написАть.

Кстати, какое отношение это имеет к переносимости?

Кстати, alloca -- ОЧЕНЬ мерзкая штука. Гораздо менее надежная, чем sprintf.

Кстати, насчет переносимости: alloca -- НЕ переносима.

О, вот из man alloca:

The alloca function is machine and compiler dependent. On many systems its implementation is buggy. Its use is discouraged.

Die-Hard ★★★★★
()

>Мне нужно переменную int записать в текстовый файл и потом считать из него. Под винду я бы просто вызвал itoa, потом fputs, чтобы положить значение в файл, затем fgets - чтобы считать. Под линукс itoa нет. Что использовать вместо? Или как обойтись без таких преобразований? Или где взять исходник функции?

Есть одно более-менее универсальное решение для C++

template<typename T>

string atos(T a) {

stringstream s;

s << a;

cout << "normal\n";

return s.str();

}

ival ★★
()
Ответ на: комментарий от anonymous

> char str[16]; int i = 10; sprintf(str,"%i",i);

дядя, я же сразу сказал sNprintf! не зря же...

2 Die-Hard:

так я и говорю, что скорость... скстати snprintf тоже
проверяет на INT_MAX... правда она еще юзает vfprintf
(по крайней мере в libc на OpenBSD). В Glibc, наверное,
сделано быстрее, поскольку там программерский hardcore
не редкость, особенно в реализациях str*....

кстати хотелось бы услышать подробнее, в какой задаче
вам нехватило скорости snprintf... ради интереса...

signal11
()
Ответ на: комментарий от signal11

Народ, ОК, спасибо большое, я почитаю man snprintf, но проблема уже как бы позади - а вы такую дискуссию развели, шо мне аж страшно за вас ;-)

anonymous
()
Ответ на: комментарий от Die-Hard

> Никогда не думал, что в русском языке есть слова "портАбельный" и "портабИльный". ИМХО ;) все же "переносимый".

Эээ... _имхо_? =)

> Угу, а еще следить за границами массивов и переполнением стэка.

Я вообще-то и предлагал следить за границами массива =) а как стандартно проверить переполнение стека я не знаю, но тоже неплохо бы =)

> Кстати, какое отношение это имеет к переносимости?

А вот это твое:

char tmp[22];/* This is a stack. 64/Log_2[10] = 19.3, so this is enough forever...*/

Кто сказал что форева? ;) Вот сделают int 128-битным, будешь знать =)

> Кстати, насчет переносимости: alloca -- НЕ переносима.

Извиняюсь, и правда. Мне почему-то всегда казалось что оно в ANSI C есть. Ну тогда старый добрый malloc...

int19h ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.