Ahojte, mám následujúce zadanie:
Kód:
Představení úkolu
Ascii85 (někdy též nazývané Base85) je kódování, které bylo vytvořeno primárně za účelem konverze binárních dat na data textová. Tato konverze umožňuje jejich přenos přes výhradně textové protokoly. Jelikož některé protokoly umožňují používání pouze vybraných tisknutelných znaků, je rozsah výstupních symbolů kódování Ascii85 omezen.
Zadání
Vaším úkolem bude vytvořit program, který ze standardního vstupu načte až 40 znaků (ne nutně tisknutelných) a zakóduje je podle algoritmu Ascii85.
Ascii85 každým 4 bajtům přiřadí bajtů 5. Postup je následující: Vstupní 4 bajty převedeme na jedno číslo N (tak, že ony 4 bajty „poskládáme za sebe“). Z tohoto čísla N nejprve vezmeme zbytek po dělení 85, čímž získáme náš první mezivýpočet, poté se N celočíselně vydělí 85 (tento proces se celkem opakuje pětkrát, čímž získáme 5 čísel). Ke každému takto získanému číslu přičteme 33. Tím jsme získali ASCII kódy výsledných pěti znaků. Kód prvního znaku je přitom poslední takto získané číslo.
Příklad:
Vstup: „Lore“
Vstupní bajt Dekadické vyjádření Binární vyjádření
L 76 01001100
o 111 01101111
r 114 01110010
e 101 01100101
N je tedy v binární soustavě vyjádřeno jako 01001100011011110111001001100101, v dekadické je to 1282372197.
Zbytek po dělení 85 Výsledek dělení 85
62 15086731
81 177490
10 2088
48 24
24 0
Výsledkem tedy bude 5 bajtů vyjádřených znaky s ASCII označením 57, 81, 43, 114, 95, což jsou znaky '9', 'Q', '+', 'r', '_' .
Výstup: „9Q+r_“
Požadavky
Napište program, který načte až 40 znaků ze standardního vstupu. Ty posléze zakóduje pomocí Ascii85 a vytiskne je na standardní výstup. Výstup bude zakončen novým řádkem.
Ze vstupu se přestane načítat, jakmile bude splněna alespoň jedna z následujících tří podmínek:
Byl načten 40. znak.
Byl načten znak '\n' (ten nebude zahrnut do znaků k zakódování).
Byl načten znak EOF (ten nebude zahrnut do znaků k zakódování).
Pokud načtený počet znaků nebude dělitelný čtyřmi, doplníme vstup nejmenším počtem znaků '\0' tak, aby v součtu počet dělitelný čtyřmi byl.
Odevzdáváte jediný soubor pojmenovaný ascii85.c
Váš příklad musí jít přeložit a fungovat dle požadavků po zkompilování na aise následujícím způsobem gcc -std=c99 -Wall -Wextra -Werror ascii85.c
Kontrola bude probíhat porovnáváním výstupů, dejte si tedy pozor, ať nevypisujete nic navíc.
Program mám hotový, vo Windowse mi funguje, na Linuxe mi nešiel debugger tak som to ešte neodladil..
Problém je ale v tom, že keď som si to dal skontrolovať, vypísalo mi: "Zaznam testu:
[TEST] Sada nanecisto
[TEST] Test nanecisto 1
[FAIL]Program nedobehl v ocekavane dobe. Program se zacyklil, nebo cekal na dalsi vstup,
nebo byl extremne pomaly."
Tak mi napadlo že asi bude problém v načítaní vstupu. V programe to riešim jednoducho cez fgets() a v tom asi bude problém. Aj keď ručne zadám EOF tak to musím odenterovať. V zadaní je písané, že načítanie skončí akonáhle bude načítaný 40. znak. Vygooglil som však, že to asi nie je také jednoduché, lebo vstup sa najprv načítava do bufferu a až odtiaľ sa posielajú dáta do programu keď shell pošle signál programu že skončil vstup.
Moja otázka je preto či sa nejak (ak hej ako..) dá obmedziť vstup užívateľa, aby skončil po zadaní 40. znaku bez potreby stlačenia enteru. Kontrola prebieha cez skript na školskom serveri takže netuším čo je na vstupe. AK bude treba hodím sem aj celý kód.
Vopred ďakujem za pomoc.
(btw deadline ja zajtra
)