Перевести число в строку

202
15 декабря 2016, 16:07

Нужно написать собственную функцию перевода из числа в строку. Вот вроде бы обратная вещь. Помогите.

string DToStr(double Val) {

char output[50] = "";
string str = "";
ostringstream ost;
ost << Val;
strcpy(output,ost.str().c_str());
output[strlen(output)] = '\0';
str = output;
return str;

}

Answer 1

Какое число? Десятичное? Целое? Положительное?

Если число а > 0, то с = '+', иначе с = '-'.

  • b = а/10, d = а%10 кладём в строку -> ___сd
  • b = b/10, d = b%10 кладём в строку -> __сdd
  • b = b/10, d = b%10 кладём в строку -> _сddd
  • ... ______________________________cd..d

Если число восьмиричное, вместо 10 - 8. Иная база анологично.

Если число дробное, то обрабатываем алгоритмом целую часть - получили строку. Далее ставим точку, а потом дробную часть e умножаем на 10:

  • b = e*10, g = e%10 кладём в строку -> сd..d.g
  • b = b*10, g = b%10 кладём в строку -> сd..d.gg
  • b = b*10, g = b%10 кладём в строку -> сd..d.ggg
  • ...
Answer 2

вот решение которое придумал @avp

 /*
      avp 2011
      Convert long-long fixed integer (64-bit) to string in the specified radix
      (any 2..64 (bin, octal, decimal, hex ...) )
      Returns string length.
     */
    #ifdef TEST
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <limits.h>
    #endif
    int
    my_llstr (long long v, // source for 'printing'
              int radix,
              int unsign,  // if 1 then unsigned source
              char *res)   // memory for result
    {
      const char *dig = "0123456789abcdef";
      static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      int          rem[65], sp = 0;   // stack for reminders
      char        *p = res;           // for return length
      unsigned long long   u = v;     // use if unsign == 1
      if (!res)
        return 0;
      if (radix < 2)
        radix = 2;
      if (radix > 64)
        radix = 64;
      if (radix > 16)
        dig = cb64;
      if (unsign) {
        while (u >= radix) {
          rem[sp++] = u%radix;
          u = u/radix;
        }
        //  *res++ = (radix > 16)? cb64[u]: dig[u];
        *res++ = dig[u];
      } else {
        if (v < 0) {
          *res++ = '-';
          if (v == (1LL << 63)) {
            rem[sp++] = (unsigned long long)(1LL << 63) % radix;
            v = -(v / radix);
          } else
            v = -v;
        }
        while (v >= radix) {
          rem[sp++] = v%radix;
          v = v/radix;
        }
        //    *res++ =  (radix > 16)? cb64[v]: dig[v];
        *res++ = dig[v];
      }
      while (sp)
        //    *res++ =  (radix > 16)? cb64[rem[--sp]]: dig[rem[--sp]];
        *res++ = dig[rem[--sp]];
      *res = 0;
      return res-p;
    }
    #ifdef TEST
    main (int ac, char *av[])
    {
      long long x;
      int  n;
      char buf[100];
      int r = av[1]? atoi(av[1]): 10;
      while (scanf("%lld",&x) == 1) {
        n = my_llstr(x, r, 0, buf);
        //    buf[n] = 0;
        printf ("%s\n",buf);
      }
      my_llstr((1LL <<63), r, 0, buf);
      printf ("LLONG_MIN: %s (%lld)\n", buf, (1LL <<63));
      my_llstr((1LL <<63), r, 1, buf);
      printf ("unsigned LLONG_MIN: %s (%llu)\n",buf, (1LL <<63));
    }
    #endif
READ ALSO
Задать формулу циклом

Задать формулу циклом

Есть формула:

320
Как записать в файл вещественное число с точкой вместо запятой?

Как записать в файл вещественное число с точкой вместо запятой?

Покажите, пожалуйста, как для функции fprintf задать форматирование так, чтобы она double писала в файл не через "," а через ""

266
Необъяснимое поведение

Необъяснимое поведение

Какого чёрта?

239
Правильный абстрактный класс

Правильный абстрактный класс

Помогите, пожалуйста, правильно описать абстрактный класс Block

223