Rozdelenie dlhsieho stringu do malych casti v C
Rozdelenie dlhsieho stringu do malych casti v C
Ahojte. Robim ulohu zo skoly a zamrzol som na jednom bode. Potrebujem cast programu, ktora mi spocita string nasledovne.
V premennej, ci v poli (neviem, ci je na to dobre pole, alebo premenna nejakeho typu) musim mat ulozeny (hex) string: "10010000214601360121470136007EFE09D21901". Potrebujem tento string programom rozdelit na dvojice a spocitat ich. Cize 10+01+00+00+21+46+01+36+01+21+47+01+36+00+7E+FE+09+D2+19+01 a vysledok v hexe, ktory je "3c0" ulozit do premennej integer. Ostatok programu mam hotovy. Bol by niekto tak mily? Dakujem.
V premennej, ci v poli (neviem, ci je na to dobre pole, alebo premenna nejakeho typu) musim mat ulozeny (hex) string: "10010000214601360121470136007EFE09D21901". Potrebujem tento string programom rozdelit na dvojice a spocitat ich. Cize 10+01+00+00+21+46+01+36+01+21+47+01+36+00+7E+FE+09+D2+19+01 a vysledok v hexe, ktory je "3c0" ulozit do premennej integer. Ostatok programu mam hotovy. Bol by niekto tak mily? Dakujem.
Re: Rozdelenie dlhsieho stringu do malych casti v C
A kde je problém? Uložím string do pola charov. Potom spravím jeden while cyklus, kde budem postupne načítavať dva znaky a sčítavať ich s doterajším výsledkom. To mi môže zaistiť nejaká funkcia, kde tieto dva znaky a doterajší výsledok pošlem a ono mi to sčíta - princíp sčítavania v hexa je rovnaký ako v desiatkovej, takže to nie je nič hrozné (príp. by sa to dalo aj bitovým súčtom)
string v C reprezentuje jedine ukazateľ na pole charov, takže typ unsigned char * + funkcia malloc je vždy nápomocná.
Takže? Kde je problém?
string v C reprezentuje jedine ukazateľ na pole charov, takže typ unsigned char * + funkcia malloc je vždy nápomocná.
Takže? Kde je problém?
Re: Rozdelenie dlhsieho stringu do malych casti v C
Dakujem za odpoved, ale ja som uplny zaciatocnik
Viem si predstavit ako by to fungovalo, ale nie v zapise. String ma 40 znakov, teda by to bolo v poli "char pole[39]" kazdy jeden znak osamote. Ale neviem ako ten string do toho pola dostat. Nieco ako "pole = 10010000214601360121470136007EFE09D21901", ale to tak nefunguje. Dakujem.
Re: Rozdelenie dlhsieho stringu do malych casti v C
String v C je tzv. "null terminated string", takže to pole musí byť pole[40] (Posledný znak bude nula ako znak konca. Tú tam ty dávať nemusíš, ale musíš jej tam urobiť miesto)
Ako ho tam dostaneš? Napríklad:
(a v tomto prípade ťa veľkosť pola ani nezaujíma)
Nie je to úplne kó-šér, ale dynamickú alokáciu sa mi vysvetľovať nechce. Vo vlastnom záujme si o tom ale niečo prečítaj ( funkcie malloc() a free() )
Takto to bude fungovať a kľudne môžeš k jednotlivým znakom pristupovať cez indexy v []
Ako ho tam dostaneš? Napríklad:
Kód: Vybrať všetko
char * pole = "10010000214601360121470136007EFE09D21901";Nie je to úplne kó-šér, ale dynamickú alokáciu sa mi vysvetľovať nechce. Vo vlastnom záujme si o tom ale niečo prečítaj ( funkcie malloc() a free() )
Takto to bude fungovať a kľudne môžeš k jednotlivým znakom pristupovať cez indexy v []
Re: Rozdelenie dlhsieho stringu do malych casti v C
Dik, ale nepohol som sa. Je to to, co som chcel, ale...posielam kod, co mam, ale nefunguje 
vysledok si predstavujem 0x3c0 po spocitani kazdej dvojice v hexe.
Kód: Vybrať všetko
main()
{
int temp = 0, i;
char * string = "10010000214601360121470136007EFE09D21901";
for(i = 0; i <= 39; i = i + 2)
{
temp = string[i]string[i + 1] + temp;
}
printf("%x", temp);
Re: Rozdelenie dlhsieho stringu do malych casti v C
Vyzerať by to mohlo asi takto:
Alebo nejak podobne. Ty potrebuješ sčítavať hexa kód, takže operátor + ti tu nepomôže. Resp. pomôže, ale musíš si najprv premeniť char (Z ASCII kódu) na odpovedajúce čísla ('0' = 48 - 48 = 0, '1' = 49 - 48 = 1, '2' = 50 - 48 = 2, 'A' = 65 - 55 = 10, B = 66 - 55 = 11 atď) a sčítať najprv druhé číslo s najnižším rádom v temp, uchovať si carry (prechod do vyššieho rádu), potom sčítať prvé číslo s desiatkovým rádom temp a nakoniec, ak bolo carry, pričítať ho k ďalšiemu rádu.
No a tieto čísla zase premieňať do ASCII podoby (pričítať 48, príp. 55 ak je >= 10)
Tento problém nie je taký triviálny ako sa môže zdať. Zoberi si papier a poriadne sa nauč sčítavať v hexa. A ešte si poriadne pozri ASCII tabuľku a pochop ju. A zase zdôrazňujem, pozri sa na dynamickú alokáciu (v mojom príklade nemôže byť výsledok viac ako 10 ciferný - to predsa nechceme. Ale na začiatok stačí.)
Kód: Vybrať všetko
UrobSucet ( char temp[10], char cis1, char cis2 )
{
/* Tu urobim sucet ALE V HEXA SUSTAVE! */
}
main()
{
int i;
char * string = "10010000214601360121470136007EFE09D21901";
char temp [10];
for ( i = 0; i < 10; i++ )
temp [i] = '0';
for(i = 0; i <= 39; i = i + 2)
{
UrobSucet ( temp, string[i], string[i+1] );
}
printf("%x", temp);
No a tieto čísla zase premieňať do ASCII podoby (pričítať 48, príp. 55 ak je >= 10)
Tento problém nie je taký triviálny ako sa môže zdať. Zoberi si papier a poriadne sa nauč sčítavať v hexa. A ešte si poriadne pozri ASCII tabuľku a pochop ju. A zase zdôrazňujem, pozri sa na dynamickú alokáciu (v mojom príklade nemôže byť výsledok viac ako 10 ciferný - to predsa nechceme. Ale na začiatok stačí.)
Re: Rozdelenie dlhsieho stringu do malych casti v C
Dakujem, s tym, si mi poradil a mam vidinu ako na to. Dobre. Ale asi si opomenul scitavanie dvojic, ak sa nemylim. Ja potrebujem, ak mam retazec napriklad "890AFF", tak scitat 89 + 0A + FF. Ak prevediem jednotlive znaky do integeru, tak mi vyjde v tomto retazci z kazdeho 'F', cislo 15. To je spravne. Ale ja potrebujem 'FF', ako celok. Ak budem mat z kazdeho 'F', cislo 15, tak nemozem nijak spojit 15 a 15 tak, aby mi vyslo 255 (cislo reprezentovane zapisom v hexe FF). Ale asi to bude vacsi problem, ako som si myslel 
-
harrison314
Hardcore addict
- Príspevky: 8223
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: Rozdelenie dlhsieho stringu do malych casti v C
bytovy sucet,sucin a posunutie ty asi nic nehovoriaBRN32 napísal:Dakujem, s tym, si mi poradil a mam vidinu ako na to. Dobre. Ale asi si opomenul scitavanie dvojic, ak sa nemylim. Ja potrebujem, ak mam retazec napriklad "890AFF", tak scitat 89 + 0A + FF. Ak prevediem jednotlive znaky do integeru, tak mi vyjde v tomto retazci z kazdeho 'F', cislo 15. To je spravne. Ale ja potrebujem 'FF', ako celok. Ak budem mat z kazdeho 'F', cislo 15, tak nemozem nijak spojit 15 a 15 tak, aby mi vyslo 255 (cislo reprezentovane zapisom v hexe FF). Ale asi to bude vacsi problem, ako som si myslel
Re: Rozdelenie dlhsieho stringu do malych casti v C
Tusim som na nieco narazil. Ak chcem spojit F a F tak, aby z toho vyslo FF, Tak vysledok (FF -> 255) dostanem ako (F*F+F) + F
Ak chcem spojit napriklad 7 a E na 7E, tak znova (7*F+7) + E ...z toho vyjde 7E. Skusim to tak
...narazil som na to, ked som si lamal hlavu nad papierom a perom a skusal
)
Ak chcem spojit napriklad 7 a E na 7E, tak znova (7*F+7) + E ...z toho vyjde 7E. Skusim to tak
Re: Rozdelenie dlhsieho stringu do malych casti v C
FF = 15*16 + 15*1 = 255BRN32 napísal:Tusim som na nieco narazil. Ak chcem spojit F a F tak, aby z toho vyslo FF, Tak vysledok (FF -> 255) dostanem ako (F*F+F) + F
7E = 7*16 + 14*1 = 126
Vieme premieňať medzi hexa a desiatkovou sústavou?
(To tvoje je to isté, len trochu inak zapísané)
Máš taký pocit? Týmto ho radšej nebudem mučiť. Naivné riešenie, aj keď je pracnejšie, je pochopiteľnejšie.harrison314 napísal:bytovy sucet,sucin a posunutie ty asi nic nehovoria
Re: Rozdelenie dlhsieho stringu do malych casti v C -vyries.
Naaaaaaaahodou som snazivy
Vsetko som to vyriesil a vyzera to velmi dobre 
Dolezita bola nasledovna funkcia, ktoru som si spravil:
Plus este niekde v kode mam:
Takze DAKUJEM, pomohli ste mi 
Dolezita bola nasledovna funkcia, ktoru som si spravil:
Kód: Vybrať všetko
int char2dec(int x)
{
if(x >= 48 && x <= 57)
{
x = x - 48;
} else {
if(x >= 65 && x <= 70)
{
x = x - 55;
} else {
printf("\nCHYBA! NEPOVOLENY ZNAKY! (%c)\n", x);
}
}
return x;
}Kód: Vybrať všetko
for(i = 0; i <= 39; i = i + 2)
{
sucet = (char2dec(pole[i])*15+char2dec(pole[i])+char2dec(pole[i + 1])) + sucet;
}-
harrison314
Hardcore addict
- Príspevky: 8223
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: Rozdelenie dlhsieho stringu do malych casti v C
to bolo skor pre BRN32-a, ale mas pravdu, ked mu to uz ide a chape tomu tamu tak je to jednoBX napísal:Máš taký pocit? Týmto ho radšej nebudem mučiť. Naivné riešenie, aj keď je pracnejšie, je pochopiteľnejšie.
Re: Rozdelenie dlhsieho stringu do malych casti v C
harrison314, ja viem, že to bolo na neho. Veď som aj za neho odpovedal 
BRN32: Paráda, niet zač
BRN32: Paráda, niet zač
Re: Rozdelenie dlhsieho stringu do malych casti v C
Pouzi funkcie na praco su stringom, neviem teraz ktora konkretne to je ale stihni si knihu Ucebnice jazyka C od pavla Herouta druhy diel a tam to najdes, ja som ich tiez kedysi v skole bol nuteny pouzit. Skus pozret strtok() alebo nieco ako substr() ale niesom si uz isty aka toto presne robi ale urcite taka existuje