[C] trasformare un numero con virgola in caratteri

di il
4 risposte

[C] trasformare un numero con virgola in caratteri

Salve a tutti e buone vacanze estive...
Io "purtroppo" devo studiare!
Comunque...

Come dal titolo, dovrei passare un numero con virgola in una stringa di caratteri...

con gli interi di solito faccio:

  while(n != 0) {
      tmp[i] = (char)(n % 10) + '0';
      n /= 10;
      ++i;
  }

  while(i > 0) {
      --i;
      buf[j] = tmp[i];
      ++j;
  }
  printf("%s\n", buf);
Ma per i numeri con la virgola, come posso fare?

4 Risposte

  • Re: [C] trasformare un numero con virgola in caratteri

    Leggi questa discussione e guarda il codice

    http://stackoverflow.com/questions/2302969/how-to-implement-char-ftoafloat-num-without-sprintf-library-function-i

    oppure, per una trattazione molto più completa, leggi il codice dell'implementazione della ftoa

    ftp://ftp.cronyx.ru/pub/FreeBSD.archive/old-releases/i386/1.0-RELEASE/ports/ingres/source/gutil/ftoa.c
  • Re: [C] trasformare un numero con virgola in caratteri

    oregon ha scritto:


    Leggi questa discussione e guarda il codice

    http://stackoverflow.com/questions/2302969/how-to-implement-char-ftoafloat-num-without-sprintf-library-function-i

    oppure, per una trattazione molto più completa, leggi il codice dell'implementazione della ftoa

    ftp://ftp.cronyx.ru/pub/FreeBSD.archive/old-releases/i386/1.0-RELEASE/ports/ingres/source/gutil/ftoa.c

    Ti ringrazio per le dritte... ma le funzioni sprintf(), atoi(), ftoi() e cc... li conosco...
    il mio studio, si basa proprio nel comprendere il funzionamento di queste funzioni...
    il primo link, mi delucida un po le idé... ma non mi è chiaro...
  • Re: [C] trasformare un numero con virgola in caratteri

    Infatti ti ho indicato il codice di quella funzione non la funzione...

    Prova a scriverne una in base agli esempi e dicci cosa non funziona o non capisci. Non so cos'altro suggerirti...
  • Re: [C] trasformare un numero con virgola in caratteri

    oregon ha scritto:


    Infatti ti ho indicato il codice di quella funzione non la funzione...

    Prova a scriverne una in base agli esempi e dicci cosa non funziona o non capisci. Non so cos'altro suggerirti...
    Scusami il ritardo, ma non ho avuto internet in questi giorni di vacanza...
    Ma in questi giorni sono arrivato a questa conclusione:
    int str_insertion_char(char *d, char *s, int x)
    {
      char ch1;
      char ch2;
      char *tmp;
      
      d += x;
      
      while(*s) {
        ch1 = *d;
        *d++ = *s++;
        tmp = d;
        while(*tmp) {
          ch2 = *tmp;
          *tmp++ = ch1;
          ch1 = ch2;
        }
        *tmp++ = ch1;
        *tmp = '\0';
      }
    
      return 1;
    }
    
    int str_reflex(char *d, char *s)
    {
      char ch;
      int i = 0;
      int j = str_size(d);
    
      if (*s == '\0') {
        --s;
      }
    
      while(i < j) {
        ch = *d;
        *d = *s;
        *s = ch;
        ++d;
        --s;
        ++i;
        --j;
      }
    
      return 1;
    }
    
    int str_int_char(char *s, long int n)
    {
      char *b = s;
      short sg = 0;
      
      if(n < 0) {
        n *= -1;
        sg = 1;
      }
    
      do {
        *b++ = (char)((n % 10) + '0');
        n /= 10;
      }while(n != 0);
    
      *b = '\0';
    
      str_reflex(s, b);
    
      if(sg == 1)
        str_insertion_char(s, "-", 0);
    
      return 1;
    }
    
    int str_floating_point(char *s, long double fp, int lim, long int size)
    {
      long int e = fp;
      fp -= e;
    
      str_int_char(s, e);
    
      while(*s) {
        ++s;
      }
    
      *s++ = '.';
    
      short bych = 0;
    
      if(size == 4) {
        bych = 7;
      }
      else {
        bych = 16;
      }
      
      short prec[bych];
      short i = 0;
      for(; i < bych; i++) {
        fp *= 10;
        prec[i] = fp;
        fp -= prec[i];
        printf("prec %d\n", prec[i]);
      }
    
      i -= 2;
    
      if(prec[i] >= 5) {
        prec[i+1] = prec[i] + 1;
      }
      else if(prec[i] < 5) {
        prec[i+1] = prec[i];
      }
    
      i = 0;
    
      if(fp < 0) {
        fp *= -1;
      }
    
      while(lim > 1) {
        *s++ = (char)(prec[i] + '0');
        --lim;
        ++i;
      }
      *s++ = (char)(prec[bych - 1] + '0');
      *s = '\0';
      
      return 1;
    }
    
    Quindi chiedo; esiste un modo per accedere direttamente alla struttura float o double?
    Perché, da quanto ho capito, i numeri in virgola mobile sono strutturati con un esponente e una matissa, tipo:
    struct _FLOAT {
        unsigned s : 1;
        unsigned e : 8;
        unsigned m : 23;
    }
    Questo è quanto ho imparato io... poi, ogni suggerimento, mi sarà utile!!
Devi accedere o registrarti per scrivere nel forum
4 risposte