c atoi
c atoi
Ako sa da previest kusok pamate a ulozit do jednej premennej.
Nieco take mam na mysli :
int i;
int x;
char j[6];
j[0]=1;
j[1]=2;
j[2]=3;
j[3]='a';
j[4]='b';
j[5]=4;
j[6]=5;
i=atoi(j[0],j[1],j[2]); // ja viem ze to je zle to iba na ilustraciu
x=atoi(j[5 az 6]); // toto tiez
printf("%d %d",i,x);
Dalo by sa to kratenim 10 ale chcem vediet ci nieje nieco jednoduchsie.
Nieco take mam na mysli :
int i;
int x;
char j[6];
j[0]=1;
j[1]=2;
j[2]=3;
j[3]='a';
j[4]='b';
j[5]=4;
j[6]=5;
i=atoi(j[0],j[1],j[2]); // ja viem ze to je zle to iba na ilustraciu
x=atoi(j[5 az 6]); // toto tiez
printf("%d %d",i,x);
Dalo by sa to kratenim 10 ale chcem vediet ci nieje nieco jednoduchsie.
Re: c atoi
treba pouzit posuvacie operacie, cize operacie << a >>.
trosku na uvod (keby si to nahodou nevedel).
char ma velkost jedneho bajtu (8bit). int, ked sa nemylim v C ma velkost dva bajty.
char a je v pamati: [_ _ _ _ _ _ _ _]
int b je v pamati: [_ _ _ _ _ _ _ _][_ _ _ _ _ _ _ _]
nech je a=[00010110]
potom ked b=a, to znamena, ze b=[00000000][00010110]
posuvacie operacie ti posuvaju bity bud dolava (<<), alebo doprava (>>). cize na b z predchadzajuceho prikladu je b>>1 == [00000000][00001011], pre b>>2 == [00000000][00000101], atd. to iste plati pre opacnu operaciu (<<). cize posuva bity dalej. co vypadne, to vymaze a doplna nuly (lepsie by si to videl v asemblery, ale zatial to takto staci).
takze spat na otazku.
z char a[2] spravis int b nasledujucim sposobom:
dufam ze som dobre pochopil tvoju otazku a toto si potreboval.
trosku na uvod (keby si to nahodou nevedel).
char ma velkost jedneho bajtu (8bit). int, ked sa nemylim v C ma velkost dva bajty.
char a je v pamati: [_ _ _ _ _ _ _ _]
int b je v pamati: [_ _ _ _ _ _ _ _][_ _ _ _ _ _ _ _]
nech je a=[00010110]
potom ked b=a, to znamena, ze b=[00000000][00010110]
posuvacie operacie ti posuvaju bity bud dolava (<<), alebo doprava (>>). cize na b z predchadzajuceho prikladu je b>>1 == [00000000][00001011], pre b>>2 == [00000000][00000101], atd. to iste plati pre opacnu operaciu (<<). cize posuva bity dalej. co vypadne, to vymaze a doplna nuly (lepsie by si to videl v asemblery, ale zatial to takto staci).
takze spat na otazku.
z char a[2] spravis int b nasledujucim sposobom:
Kód: Vybrať všetko
char a[0] = 1; //[00000001]
char a[1] = 2; //[00000010]
int b = 0; //[00000000][00000000]
b = a[0]; //[00000000][00000001]
b = b << 8; //[00000001][00000000] -> toto je inac hodnota 256 (2^8).
// ked teraz spravis b = a[1], tak to spravi, ze b=[00000000][00000010]. preto urobime toto:
b += a[1]; //[00000001][00000010] -> cize dostanes hodnotu 256 + 2 = 258 (2^8 + 2^1).
Re: c atoi
A ak natrafi na znak tak potom co lebo mne ide hlavne o to aby som vedel rozdelit cislo pred znakom a za nim.
cize char j[0]=1;
j[1]=2;
j[2]=3;
j[3]=a;
j[4]=4;
int x,i;
i=123;
x=4;
j=a;
cize char j[0]=1;
j[1]=2;
j[2]=3;
j[3]=a;
j[4]=4;
int x,i;
i=123;
x=4;
j=a;
Re: c atoi
znak je iba jedna hodnota z moznych 256, co je v pamati ulozene. pozri si ASCII tabulku (napr. tu).
to znamena, ze napr. 'a' == [01100001] a 'A' == [01000001].
treba si uvedomit, ze vzdy pracujes s cislami, len su rozne reprezentovane. skus si nechal vypisat toto:
V podstate preto je velky rozdiel, ci do jedneho bajtu napises hodnotu 1, alebo hodnotu '1' (cize hodnotu znaku z ASCII tabulky). V prvom pripade to bude [00000001] v druhom pripade [00110001].
Na zaklade ASCII hodnot by si mal vediet vyhodit/rozpoznat znaky, ktore nepotrebujes.
to znamena, ze napr. 'a' == [01100001] a 'A' == [01000001].
treba si uvedomit, ze vzdy pracujes s cislami, len su rozne reprezentovane. skus si nechal vypisat toto:
Kód: Vybrať všetko
printf("%d %c", 'A', 'A'); //mal by si dostat toto: 65 A
Na zaklade ASCII hodnot by si mal vediet vyhodit/rozpoznat znaky, ktore nepotrebujes.
Re: c atoi
Ale ja chcem dostat cislo 12 a nie 258 ja potrebujem 000001100
Re: c atoi
1. Na beznych PC je int 32-bit.
2. Skusal si i=atoi(j), imho by to mohlo spravit ze i bude 123.
2. Skusal si i=atoi(j), imho by to mohlo spravit ze i bude 123.
Re: c atoi
Atoi som skusal ale nic a imho to je co/kto ?
Re: c atoi
"imho" je skratka od in my humble opinion (teda nieco ako podla mojho nazoru).
Ako to funguje, ak j je pole charov (char*), tak atoi(j) konvertuje retazec j na cislo reprezentovane tymto retazcom. Ako sa to deje, co sa robi s necislami, je najditelne pomocou googlu. Problem je, ze z tvojho popisu nie je ani trochu jasne, co chces spravit. Najednoduhsie ako opisat, co chces je napisat co je vstup a co ma byt vystup. Pripadne uviest priklad, tvoje priklady ale maju problem s tym, ze nepopises, vyznam toho co tam mas.
Ako to funguje, ak j je pole charov (char*), tak atoi(j) konvertuje retazec j na cislo reprezentovane tymto retazcom. Ako sa to deje, co sa robi s necislami, je najditelne pomocou googlu. Problem je, ze z tvojho popisu nie je ani trochu jasne, co chces spravit. Najednoduhsie ako opisat, co chces je napisat co je vstup a co ma byt vystup. Pripadne uviest priklad, tvoje priklady ale maju problem s tym, ze nepopises, vyznam toho co tam mas.
Re: c atoi
Skusam si urobit kalkulacku (v konzole). Ak dostanem priklad napr. (1+1)*2-0+(8+8+4-2)*11+45 (vsetko v jednom riadku). Tak ako zistom ze su tam cisla 45,1,11,8 atd. Ja to skusam tak ze kontrolujem ci tam nie su zatvorky (ak ano tak hladam znaky *,/,+,- a urobim operaciu) potom znaky *,/,+,- a teraz potrebujem tie cisla aby som mohol urobit tie operacie (*,/,+,-). Kazdy znak mam v osobitnom poli tak ako ulozim do premennej(i) cislo 45 a nie iba 4 ?
Re: c atoi
ked robis taketo nieco, tak sa skus pozriet na stromove struktury pre aritmeticke operacie. napr. podobne nieco, ako je to v tomto deme (aj ked to potrebuje viac zatvoriek...).
dalsia moznost je na to pouzit ANTLR.
btw: prevod cislic z char do int bez atoi:
dalsia moznost je na to pouzit ANTLR.
btw: prevod cislic z char do int bez atoi:
Kód: Vybrať všetko
int counter = 0, i = 0;
char a [5];
a[0] = '1';
a[1] = '2';
a[2] = '3';
a[3] = 'a';
for(i = 0; i < 5 && a[i]>'0' && a[i]<'9'; i++){
counter *= 10;
counter += (a[i] - '0');
}
printf("Tvoje cislo je: %d", counter);
Re: c atoi
Neviem ci je chyba u mna ale to tvoje riesenie mi neide stale pise 0 ta podmienka v cykle sa vzdy vyhodnoti ako nespravna.
Re: c atoi
napis hodnoty, co si tam nahadzal. ked si tam dal 1, 2, ... a nie '1', '2', ..., tak samozrejme fungovat nebude.
Re: c atoi
Uz tomu rozumiem dik