Rozdelenie dlhsieho stringu do malych casti v C

Programovacie jazyky, rady, poradňa...
BRN32
Novice
Novice
Používateľov profilový obrázok
Príspevky: 8
Registrovaný: 19 apr 2012, 0:21

Rozdelenie dlhsieho stringu do malych casti v C

Príspevok od používateľa BRN32 »

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.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Rozdelenie dlhsieho stringu do malych casti v C

Príspevok od používateľa BX »

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? :)
BRN32
Novice
Novice
Používateľov profilový obrázok
Príspevky: 8
Registrovaný: 19 apr 2012, 0:21

Re: Rozdelenie dlhsieho stringu do malych casti v C

Príspevok od používateľa BRN32 »

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.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Rozdelenie dlhsieho stringu do malych casti v C

Príspevok od používateľa BX »

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:

Kód: Vybrať všetko

char * pole = "10010000214601360121470136007EFE09D21901";
(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 [] :)
BRN32
Novice
Novice
Používateľov profilový obrázok
Príspevky: 8
Registrovaný: 19 apr 2012, 0:21

Re: Rozdelenie dlhsieho stringu do malych casti v C

Príspevok od používateľa BRN32 »

Dik, ale nepohol som sa. Je to to, co som chcel, ale...posielam kod, co mam, ale nefunguje :(

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);
vysledok si predstavujem 0x3c0 po spocitani kazdej dvojice v hexe.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Rozdelenie dlhsieho stringu do malych casti v C

Príspevok od používateľa BX »

Vyzerať by to mohlo asi takto:

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);
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čí.)
BRN32
Novice
Novice
Používateľov profilový obrázok
Príspevky: 8
Registrovaný: 19 apr 2012, 0:21

Re: Rozdelenie dlhsieho stringu do malych casti v C

Príspevok od používateľa BRN32 »

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
Hardcore addict
Používateľov profilový obrázok
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

Príspevok od používateľa harrison314 »

BRN32 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 :-(
bytovy sucet,sucin a posunutie ty asi nic nehovoria
BRN32
Novice
Novice
Používateľov profilový obrázok
Príspevky: 8
Registrovaný: 19 apr 2012, 0:21

Re: Rozdelenie dlhsieho stringu do malych casti v C

Príspevok od používateľa BRN32 »

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 :))
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Rozdelenie dlhsieho stringu do malych casti v C

Príspevok od používateľa BX »

BRN32 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
FF = 15*16 + 15*1 = 255
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é)
harrison314 napísal:bytovy sucet,sucin a posunutie ty asi nic nehovoria
Máš taký pocit? Týmto ho radšej nebudem mučiť. Naivné riešenie, aj keď je pracnejšie, je pochopiteľnejšie.
BRN32
Novice
Novice
Používateľov profilový obrázok
Príspevky: 8
Registrovaný: 19 apr 2012, 0:21

Re: Rozdelenie dlhsieho stringu do malych casti v C -vyries.

Príspevok od používateľa BRN32 »

Naaaaaaaahodou som snazivy :) Vsetko som to vyriesil a vyzera to velmi dobre :)
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;
}
Plus este niekde v kode mam:

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;
		}
Takze DAKUJEM, pomohli ste mi :)
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
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

Príspevok od používateľa harrison314 »

BX 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.
to bolo skor pre BRN32-a, ale mas pravdu, ked mu to uz ide a chape tomu tamu tak je to jedno
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Rozdelenie dlhsieho stringu do malych casti v C

Príspevok od používateľa BX »

harrison314, ja viem, že to bolo na neho. Veď som aj za neho odpovedal :D

BRN32: Paráda, niet zač :)
juraj++
Medium Expert
Medium Expert
Príspevky: 105
Registrovaný: 10 okt 2006, 21:54

Re: Rozdelenie dlhsieho stringu do malych casti v C

Príspevok od používateľa juraj++ »

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
Napísať odpoveď