https://github.com/kbnim/elte-fi-imperative-assignment
Command-line utility for reversing text. [Course: Imperative Programming]
https://github.com/kbnim/elte-fi-imperative-assignment
c c-basics command-line-tool file-operations header-files low-level-programming memory-management
Last synced: 5 months ago
JSON representation
Command-line utility for reversing text. [Course: Imperative Programming]
- Host: GitHub
- URL: https://github.com/kbnim/elte-fi-imperative-assignment
- Owner: kbnim
- Created: 2024-04-18T06:13:59.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-05-10T10:18:22.000Z (about 2 years ago)
- Last Synced: 2024-12-30T07:08:44.011Z (over 1 year ago)
- Topics: c, c-basics, command-line-tool, file-operations, header-files, low-level-programming, memory-management
- Language: C
- Homepage:
- Size: 7.81 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Imperative Programming: `rev` utility
Command-line utility for reversing text. [Course: Imperative Programming]
## Description
_(The task was written in Hungarian. Translation coming soon.)_
### 1. A _reverse_ parancs megvalósítása
Ebben a feladatban megvalósítjuk a `reverse` parancsot: az argumentumként kapott fájlok tartalmát, vagy a konzolról beolvasott sorokat sorszámozva vagy sorszámozás nélkül, fordított sorrendben, és a sorokat megfordítva (tükrözve) írjuk ki a standard outputra. Pl. ha a `test.txt` tartalma a következő, és sorszámozást is kérünk:
```
alma
barack
szilva
```
... akkor a `reverse` parancs eredménye a következő:
```
3 avlizs
2 kcarab
1 amla
```
Példa több fájl feldolgozására: ha a `test.txt` fájlt kétszer adjuk meg paraméterül, és nem kérünk sorszámozást, akkor a kimenet a következő:
```
avlizs
kcarab
amla
avlizs
kcarab
amla
```
A megoldáshoz feltesszük, hogy bármely fájl teljes egészében elfér a memóriában.
A megoldás forráskódját (a `.c` ´es `.h` fájlokat, tehát a lefordított binárist nem kell) egy `zip` fájlba tömörítve töltsd fel! A megoldást a határidő lejártáig akárhányszor fel lehet tölteni. A beküldött megoldást automata tesztelő fogja lefordítani. A fordítás eredményét komment formájában láthatod majd a Canvasen.
**Fontos**: a feladatban leírt kimeneteket pontosan a megadott formátumban adjuk meg, különben az
automata tesztelő rossz megoldásnak fogja értékelni a programot!
(_Megjegyzés_: a feladat alapja a `rev` Unix utility, amely a kapott bemenet(ek) tartalmát eredeti sorrendben, de sorszámozás nélkül és a sorokat megfordítva írja ki.)
### 2. Feladat
A program olvassa be az első parancssori argumentumként, hogy szeretnénk-e a sorszámokat is kiírva
látni a képernyőre! A paraméter két lehetséges értéke legyen “`linenums`” ´es “`nolinenums`”, más stringet
ne fogadjunk el. Második parancssori argumentumként olvassuk be egy tetszőleges sor maximális hosszát
(a beolvasott karakterek maximális számát)! Ezt a két adatot tároljuk egy struktúrában.
Amennyiben a felhasználó nem ad meg legalább két parancssori argumentumot, jelenítsük meg a
következő használati utasítást (a második sor egy tabulátorral kezdődik), majd fejeződjön be a program:
```
Usage:
rev [SHOW LINE NUMBERS] [MAX LINE LENGTH] files...
```
A beolvasandó fájlok nevét további parancssori argumentumokként adjuk meg a programnak, és
olvassuk be egyenként a fájlok tartalmát. Ha az aktuális argumentum hibát okoz (a fájlt nem sikerült
megnyitni), írjunk hibaüzenetet a standard error outputra, és folytassuk a végrehajt´ast a következő
argumentummal. A hibaüzenet legyen: `File opening unsuccessful: `. Ha a fájl egy sora
hosszabb, mint a maximális sorhossz, a fennmaradó karaktereket hagyjuk figyelmen kívül!
Ha a felhasználó nem adott meg egy fájlnevet sem, olvassunk be sorokat a standard inputról, amelyek
legfeljebb a megadott maximális számú karakterből állnak! Ebben az esetben ne írjunk a konzolra semmit,
csak várjunk a felhasználó inputjára.
(Tipp 1: a fájl típusú pointer valójában egy stream, amely helyettesíthető a standard inputtal
(`stdin`).)
(Tipp 2: az `EOF` eseméeny Unix rendszeren a `Ctrl+D`, Windowson a `Ctrl+Z` parancssal váltható ki.)
A sorok tárolásához használjunk dinamikus tömböt! A tömb létrehozásakor a mérete legyen egy előre
rögzített érték (pl. `8`). Ha a memóriafoglalás sikertelen, írjunk ki hibaüzenetet (`Memory allocation failed!`),
és fejezzük be valamilyen hibakóddal a végrehajtást. (Ugyanez vonatkozik a tömb méretének megváltoztatására.)
Ne száamoljuk meg előre az aktuális fájl sorait, hanem duplázzuk meg a tömb méretét, amennyiben a sorok
száma túllépi az aktuális méretet!
A megoldást bontsd több fordítási egységre! A `main` függv´eny kerüljön a `main.c` fájlba, minden más
függvényimplementáció kerüljön külön fordítási egységbe, amelyhez készüljön el egy header állomány. A
header állományt védd header guarddal.
### 3. Elvárás a programmal szemben
- A nem forduló kód automatikusan 0 pontot ér. (Természetesen ez csak a legutoljára feltöltött
megoldásra vonatkozik, a feladat határideje után.)
- Ne használj globális változókat!
- Logikusan tagold a megoldást. A megoldás részeit külön függvényekben valósítsd meg.
- Ügyelj, hogy ne legyen a programban memóriaszivárgás!
- Kerüld a nem definiált viselkedést okozó utasításokat!
### 4. Tanácsok
- Ne feledkezzünk meg a dinamikus memóriafoglalás sikerességének ellenőrzéséről, és a foglalt memória
felszabadításáról! Teszteld a programot `valgrind`dal, hogy felderítsd az esetleges memóriaszivárgást.
- Amennyiben a beolvasáshoz az `fgets` függvényt használod, ne feledd, hogy ha a sor rövidebb, mint
a puffer maximális hossza, a függvény beolvassa a sortörést is, ami a kiírásnál hibás eredményhez
vezethet.
## Compilation
To compile, simply enter the following command:
```bash
gcc -W -Wall -Wextra -pedantic main.c utils.c reverse.c init.c -o rev
```