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