[ Iznogud @ 13.08.2002. 18:27 ] @
Moze li neko da mi kaze kako najjednostavnije konvertovati neko broj
tipa int (ili int*) u char [] (ili char*) (i obratno char* u int) -dakle u pokazivac na niz znakova da bih mogao pristupiti svakoj cifri ponasob.
Imam neko resenje ali mi se ne svidja. Znam da postoje f-je tipa itoa, i64toa ali bih hteo sam da napisem f-ju.
[ Aleksandar Marković @ 13.08.2002. 18:43 ] @
Hajde, Random objasni čoveku....:-)
[ Dragi Tata @ 13.08.2002. 19:03 ] @
Na 32-bitnim sistemima int i char* imaju istu veličinu, pa je konverzija trivijalna:

Code:

char* char_string = "Neki String";
int celobrojni = (int)char_string;
char* neki_drugi_char_string = (char*) celobrojni;


Međutim, ne mogu da izdržim a da ne dodam da su u najvećem broju slučajeva ovakve konverzije znak ozbiljnog propusta u dizajnu.

Naknadna dopuna: Ovo u stvari nije odgovor na postavljeno pitanje, ali ga ipak ostavljam.

[Ovu poruku je menjao Dragi Tata dana 13.08.2002 u 11:31 AM GMT]
[ random @ 13.08.2002. 20:14 ] @
Ajde, kad sam već prozvan, evo i rešenje bez castovanja...

Code:

void inttochar(int ceo_broj, char* char_string) {
    int i = 0;
    int j;
    char tmp;
    
    /* odvajamo cifru po cifru sa ceo_broja i trpamo odgovarajuci ascii znak u niz,
       od najnize cifre ka najvisoj. 0x30 je ASCII znak '0', tj. donje se moze
           napisati i kao: char_string[i++] = ceo_broj % 10 + '0'
     */
    while (ceo_broj>10) {
        char_string[i++]=ceo_broj%10+0x30;
        ceo_broj=(ceo_broj-ceo_broj%10)/10;
    }
    char_string[i++]=ceo_broj+0x30;
    char_string[(i)]=''; /* ovo i sam stavio u zagradu da se ne bi zbunio gojkov parser :o) */
    
    /* sad treba samo prevrnuti dobijeni string kao carapu, jer smo cifre stavljali
       obrnutim redosledom
     */
    for (j=0; j<i/2; j++) {
        tmp=char_string[j];
        char_string[j]=char_string[(i-1)-j];
        char_string[(i-1)-j]=tmp;
    }

}
[ jc denton @ 13.08.2002. 20:24 ] @
A, da li je moglo nekako iz prvog udarca (petlje) da se odradi ovo ?
Bez one for petlje?

[ Dragi Tata @ 13.08.2002. 20:30 ] @
Aaaaah! Pogrešno sam razumeo pitanje!

Zaboravite ono sa kastovanjem - to radi nešto sasvim drugo.
[ random @ 14.08.2002. 15:21 ] @
jc denton: jedna petlja bi mogla da se izbaci ako bi mogao bez petlje da odrediš broj cifara, odnosno red veličine broja. Onda bi mogao da smeštaš cifre obrnutim redosledom u char_string. Nemam ideju sada kako bi bez petlje mogao odrediti broj potrebnih cifara. Ali zanimljivo je pitanje, ajde baš da vas vidim :o). Ovo će biti ko Dejanove Pitalice.
[ leka @ 14.08.2002. 19:38 ] @
Prikacio sam Dev-C++ (www.bloodshed.net) projekat u kome se nalazi malena funkcija Iznogud2String() koja radi isto sto i itoa() s tim da se podrazumevana osnova 10. :)

Iznogud sada moze malo da analizira source i da sam napise String2Iznogud() funkciju koja ce string da prebaci u broj (mnogo lakse). :)
[ leka @ 14.08.2002. 19:40 ] @
Citat:
random:
jc denton: jedna petlja bi mogla da se izbaci ako bi mogao bez petlje da odrediš broj cifara, odnosno red veličine broja. Onda bi mogao da smeštaš cifre obrnutim redosledom u char_string. Nemam ideju sada kako bi bez petlje mogao odrediti broj potrebnih cifara. Ali zanimljivo je pitanje, ajde baš da vas vidim :o). Ovo će biti ko Dejanove Pitalice.


Moje resenje upravo to i radi - odredi se broj cifara (pomocu prirodnog logaritma) a onda se radi ostalo...
[ srki @ 14.08.2002. 21:56 ] @
Leko, to resenje uopste nije bolje (brze) jer kad pozoves prirodni logaritam program ce ipak pomocu petlje da racuna prirodni logaritam koristeci tejlorov polinom.

Znaci ipak ces imati for petlju ali se nece videti u kodu.

Ne vidim nacin da se izostavi for petlja.

U stvari moze da se zeza sa pokazivacima pa da brojeve stavljate unazad ali tako se samo bezveze komplikuje. To vreme moze da se utrosi da se optimizuju neke druge stvari i da se optimizuje neki komlikovaniji algoritam i da neki eksponencijalni svedete na polinomijalni. Ovako samo povecavate sansu da dodje do greske i povecavate vreme odrzavnja koda. Dok drugi programer koji treba nesto da ispravi/doda shvati sta ste hteli proci ce mnogo vremena.

Zato sam protivnik optimizovanja nekih tako banalnih stvari, a narocito ako se to ne izvrsava previse cesto. Naravno ako je to neko 3d programiranje gde se stalno racuna i racuna onda bi trebalo optimizovati kod.

...Svi imaju pravo da se ne slazu sa mnom :-)

[ random @ 15.08.2002. 00:48 ] @
Da, tačno, ceobrojni deo od log10(x) bi dao broj cifara. Mada je to dekadni a ne prirodni logaritam.

I da, slažem se, tako bi sors bio kraći, ali bi se program zapravo duže izvršavao, jer se log10 računa kao double pa castuje u int, što je duže nego deljenje po modulu i oduzimanje.
[ Dragi Tata @ 15.08.2002. 02:16 ] @
Ako koristiš C++ (ne C), rešenje bi mogla da bude klasa lexical_cast iz boost biblioteke:

http://www.boost.org/libs/conversion/lexical_cast.htm
[ leka @ 15.08.2002. 13:23 ] @
Ama ljudi covek je hteo da napise svoju funkciju cisto radi vezbanja, ja sam mu napisao funkciju koja radi. Niko od Vas nije pomogao coveku - svi ste poceli da raspravljate, teoretisete.
Naravno, ja cu UVEK da se slozim da kod koji sam napisao nije optimizovan - banalno receno nije dobar - ali radi. Covek na osnovu mog koda moze da krene u istrazivanje. Ako dobro poznaje matematiku moze da primeni razne metode da dodje do resenja.
Drugacije bi bilo da je postavio pitanje "Kako da se NAJBRZE izvede konverzija BROJ->STRING ?" , onda bih se ja bacio i na optimizovanje koda!

P.S. randomovo resenje mi je palo odmah na pamet, ali ne volim kada dobijem string koji treba da "obrcem". :)
[ srki @ 15.08.2002. 16:19 ] @
Ma ja sam utripovao da on hoce da napravi nesto sto blize optimalnom resenju pa otud cela ova prica. A ako nekog i to zanima o tome u nekoj drugoj temi....
[ VRider @ 14.12.2002. 14:25 ] @
Citat:
Dragi Tata:
Na 32-bitnim sistemima int i char* imaju istu veličinu, pa je konverzija trivijalna:

Code:

char* char_string = "Neki String";
int celobrojni = (int)char_string;
char* neki_drugi_char_string = (char*) celobrojni;




Kod mene ovo vraca gresku kad izvrsavam program
"Segmentation fault"

Uz to, funkcija itoa() u stdlib.h vise ne postoji?! GCC 3.2.
[ Dragi Tata @ 15.12.2002. 03:39 ] @
Meni se ne javlja nikakav "Segmentation fault" (odnosno "Access Violation" na Win32) kod izvršavanja ovog koda, a ne znam i zašto bi. Jesi li siguran da nisi nešto naknadno dodao?

Međutim, kao što sam već napomenuo, ovaj ne radi ono što je postavljač teme želeo (mali nesporazum), mada je strogo gledano, konverzija int u char* upravo to što sam napisao.
[ VRider @ 15.12.2002. 17:54 ] @
Sta se desilo sa dobrim starim itoa()?
[ tOwk @ 15.12.2002. 18:01 ] @
Ne odgovara ti sprintf()?? Koja ti je konverzija zapravo potrebna?
[ VRider @ 15.12.2002. 20:15 ] @
int u string ili char*.
[ Reljam @ 16.12.2002. 00:13 ] @
To radi sscanf (radi i itoa, kao sto je neko gore napisao):

char *str="102";
int i;
sscanf(str, "%d", &i);

I onda ce i da bude 102. Da li je to to sto tebi treba?
[ VRider @ 16.12.2002. 20:31 ] @
To je upravo ono sto trazim. Funkcija itoa() je izbacena (!?) kod GCC-a 3.2?
Najveca fora - kada se kompajlira "hello world", gcc 3.2 izbacuje milon warninga!
[ Dragi Tata @ 16.12.2002. 20:55 ] @
Koliko ja znam, funkcija itoa() nije deo ANSI C-a.
[ Ivan Dimkovic @ 16.12.2002. 21:20 ] @
Citat:
Najveca fora - kada se kompajlira "hello world", gcc 3.2 izbacuje milon warninga!


Pa ako je C kompajler dobar, padaju mi na pamet sledece stvari:

printf() undefined, assuming extern returning int

int main() should return a value (ako je main definisan kao int)

itd..