Dalsi zahada v C -> Prevod long int na string

Milan B. milan na bastl.sk
Neděle Červenec 24 17:21:27 CEST 2011


On 24.7.2011 11:37, Michal Gregor wrote:
> Tak jsem program upravil na funkce itoa() a utoa().
> Kompilator ale hlasi chybu. Tyto funkce nezna.
> Koukam do navodu - jsou tam.
> Divam se do knihoven, nic takoveho tam neni. Ht-Soft je sice napsal do
> navodu, ale do knihoven je zapomnel dat.
>

Netreba z toho robit tragediu. Su to jednoduchucke funkcie a a daju sa 
spichnut za par minut. Napriklad (vsetko bolo kompilovane a testovane v 
gcc, kontrola (radix >0 && radix <= 16) je umyselne vynechana):

char *utoa(char *s, unsigned n, int radix)
{
     int i,j;
     unsigned char c;

     i=0;
     do {
         s[i++] = "0123456789ABCDEF"[n % radix];
     } while ((n /= radix) > 0);

     s[i]='\0';

     for (j = 0, i--; j<i; i--, j++) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
    return s;
}

char *itoa(char *s,int n, int radix)
{
     if (n<0) {
         s[0]='-';
         utoa(s+1,(unsigned)(-n),radix);
     } else {
         utoa(s,(unsigned)n,radix);
    }
    return s;
}

Ak staci len do desiatkovej sustavy, tak sa to moze (bezvyznamne) 
zjednodusit:

char *utoa(char *s, unsigned n)
{
      int i,j;
      unsigned char c;

      i=0;
      do {
          s[i++] = n % 10 + '0';
      } while ((n /= 10) > 0);

      s[i]='\0';

      for (j = 0, i--; j<i; i--, j++) {
          c = s[i];
          s[i] = s[j];
          s[j] = c;
      }
    return s;
}

char *itoa(char *s,int n)
{
     if (n<0) {
         s[0]='-';
         utoa(s+1,(unsigned)(-n));
     } else {
         utoa(s,(unsigned)n);
    }
    return s;
}

Poznamka pre uplnost: takato itoa nefunguje s najzapornejsim cislom pre 
rozsah int, pretoze napr. pri 16-bitovom int  pre najzapornejsie cislo 
-32768  neexistuje kladne 32768 (max. je 32767).

Napriklad pre 16-bitovy integer by bolo vhodne osetrenie trebars takto 
(vo funkcii itoa):

if (n==-32768) {
   strcpy(s,"-32768");
} else {
...
}

utoa je v poriadku pre cely rozsah.

-m-


> Tady je k tomu diskuze:
> http://forum.htsoft.com/all/showflat.php?Cat=0&Number=33532&page=2&fpart=all&vc=1 
>
>
>
>
>
>
> Michal Gregor
>
>
>
>> Jan Waclawek konfera na efton.sk
>> Úterý Červen 21 14:17:51 CEST 2011
>
>> Neviem ako pri Vasom prekladaci, ale obvykle maju kniznice >k C 
>> (najma na
>> jednocipy) na tento ucel funkciu ltoa() (a >potom aj rozne ito(), ftoa()
>> apod.), presne kvoli tomu ze >xxprintf() je nafuknuty a pomaly mamut.
>
>> Ak nie, tak asembler, alebo trpiet pripadnou pomalostou >delenia.
>
>> wek
>
>
> ----- Original Message ---------------
>> Jak prevadite long int na string? Nasel jsem priklady s delenim, ale 
>> asi to
>> bude taky pekne pomale.
>> (Jeste mam havarijni plan zmenit vystupni format na hexa cisla.)
>>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list