Dalsi zahada v C -> Prevod long int na string
Michal Gregor
a2x1nptda8 na email.cz
Pondělí Červenec 25 20:54:45 CEST 2011
Je tam pointer "s". K cemu slouzi na co tam je?
Staci napsat VystupniRetezec nebo VystupPrevedeneCisloRetezec a na prvni
pohled vidim k cemu ta promenna je. Nemusim studovat kod.
Michal Gregor
----- Original Message -----
From: "Michal Gregor" <a2x1nptda8 na email.cz>
To: "HW-news" <hw-list na list.hw.cz>
Sent: Monday, July 25, 2011 8:52 PM
Subject: Re: Dalsi zahada v C -> Prevod long int na string
Ja bych rekl ze je to ukazka toho jak se nemaji psat programy. Je to dost
neprehledne a tyhle silene zapisy obvykle ne vsechny prekladace sezerou.
Navic takto zahusteny kod nebude po prekladu kratsi.
Michal Gregor
----- Original Message -----
From: "Petr Tošovský" <PetrTos na altopro.cz>
To: "HW-news" <hw-list na list.hw.cz>
Sent: Monday, July 25, 2011 7:46 PM
Subject: Re: Dalsi zahada v C -> Prevod long int na string
Mam dotaz k radku
s[i++] = "0123456789ABCDEF"[n % radix];
Jestli to dobre chapu, tak na jednom radku definujete pole primym zapisem a
indexem z polehned vyberete vhodny prvek podle zbytku deleni. To je korektni
zapis? C znam jen na urovni beznych zakladu. Mate zkusenost jak se to pak
implemenuje? Neni lepsi mit retezec v datove pameti jako promennou primo? Ma
to nejake vyhody/nevyhody?
Diky za peknou ukazku.
Tosa
"Milan B." <milan na bastl.sk> napsal(a):
>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-
--
Odesláno z mého tabletu s Androidem pomocí pošty K-9 Mail. Omluvte prosím
mou stručnost.
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
_______________________________________________
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