ΒΑΘΜΟΣ ΣΧΟΛΙΑ - στην malloc που χρησιµοποιήσατε, δεν έχετε αφήσει χώρο για το \0 και χρησιµοποιείτε sizeof µε λάθος τρόπο. Στο τέλος που βάζετε το \0 είναι στην πραγµατικότητα σε µνήµη που δεν έχετε δεσµεύσει και υπάρχει η πιθανότητα να σκάσει το πρόγραµµά σας. - σωστά επιστρέφετε NULL σε περίπτωση που δεν βρει τον χαρακτήρα - δεν ελέγχετε αν αποτυγχάνει η malloc. - στον πίνακα απο strings, σε περίπτωση που δεν βρίσκετε κάποιον χαρακτήρα, αφήνετε τη θέση του πίνακα κενή και µάλιστα αναρχικοποίητη. Θα ήταν καλύτερο, να αυξάνετε τον µετρήτή για τον Μ.Σ. FAIL πίνακα µόνο οταν είστε σίγουροι οτι υπάρχει ο χαρακτήρας µέσα στο string. - δεν ελέγχετε καθόλου αν έχει πετύχει η συνάρτηση εύρεσης του χαρακτήρα και έτσι αν δεν το βρεί το πρόγραµµα σκαει. - H συνάρτηση που εκτυπώνει είναι σωστή µόνο όταν υπάρχουν πάντα οι split χαρακτήρες µέσα στα string. Αν δεν υπάρχουν, πάει να διαβάσει απο θέση µνήµης NULL και σκάει. - H συνάρτηση απελευθέρωσης της µνήµης είναι σωστή. - σωστά χρησιµοποιήσατε το formatstring - η κλήση των συναρτήσεων για την εκτύπωση είναι σωστή η συνθήκη για έξοδο είναι αυτή σωστή. - Η υλοποίηση της συνάρτηση επεξεργασίας του string είναι σωστή αλλά δεν έχετε βάλει const στις παραµέτρους της συνάρτησης και συγκεκριµένα στο string που περνάτε σαν όρισµα. - στην malloc που χρησιµοποιήσατε, δεν έχετε αφήσει χώρο για το \0 το οποίο επίσης δεν βάζετε στο τέλος. - σωστά επιστρέφετε NULL σε περίπτωση που δεν βρει τον χαρακτήρα - στον πίνακα απο strings, σε περίπτωση που δεν βρίσκετε κάποιον χαρακτήρα, αφήνετε τη θέση 00497 του πίνακα κενή και µάλιστα αναρχικοποίητη. Θα ήταν καλύτερο, να αυξάνετε τον µετρήτή για τον Οριακό PASS πίνακα µόνο οταν είστε σίγουροι οτι υπάρχει ο χαρακτήρας µέσα στο string. - H συνάρτηση που εκτυπώνει είναι σωστή µόνο όταν υπάρχουν πάντα οι split χαρακτήρες µέσα στα string. - H συνάρτηση απελευθέρωσης της µνήµης είναι σωστή. - σωστά χρησιµοποιήσατε το formatstring - σωστή και η κλήση της συνάρτησης. η συνθήκη για έξοδο είναι και αυτή σωστή. - Σωστή η συνάρτηση function, αλλά έχει ΑΠΑΡΑΔΕΚΤΟ όνοµα - Δεν υπολοιήσατε τις άλλες 2 συναρτήσεις που χρειαζόταν η άσκηση. Ολοκληρώστε τη στο σπίτι. 02103 FAIL Στη main: - Αφήνουµε ΚΕΝΟ στην scanf (για να µη διαβάσει το enter) γραµµή 29 ' %c'! - Η συνθήκη στην επανάληψη (γραµµή 31) έπρεπε να είναι &&, δηλαδή επανέλαβε όσο το selection είναι διαφορετικό από y και n. - Στην εξωτερική επανάληψη (γραµµή 33) θα πρεπει να υπάρχει και µια συνθήκη ώστε τα inputs < ARRAY_SIZE. 02104 οριακό PASS 02107 FAIL -Σωστή υλοποίηση της συνάρτησης επεξεργασίας του string αλλά δεν βάζετε /0 στο τέλος κάθε string. -Στη συνάρτηση εκτύπωσης δεν κάνετε έλεγχο για να παρακάµψετε τυχόν NULL εισαγωγές. -Σωστή η συνάρτηση απελευθέρωσης µνήµης αλλά δεν την καλείτε στο σωστό σηµείο. -Χρησιµοποιείτε fgets και δεν αφαιρείτε το \n -Σωστή στοίχιση και ονόµατα παραµέτρων και µεταβλητών. - Στη return_str : - στη malloc έπρεπε να δεσµεύατε ένα ακόµη byte για το \0 - αν το size είναι 0 η συνάρτηση πρέπει να επιστρέφει το κενό string "" και όχι NULL - δεν κατασκευάζετε το string. - Στη find_valid_strings (η οποία έχει παραπλανητικό όνοµα): - Το *ptr_array δείχνει πάντα στο πρώτο string του πίνακα - Στη free_memoth - Έπρεπε να περνάτε τον πίνακα από pointers, όχι ένα string - Στη main: - Όταν διαβάζουµε string µε scanf πρέπει πάντα να βάζουµε περιορισµό µεγέθους στο format string! - Η θέση ARRAY_SIZE που προσπελάζετε είναι εκτός των ορίων του πίνακα. Page 1
02109 PASS lab12grades - Καλά σχόλια και στοίχιση. - Καλά ονόµατα µεταβλητών και συναρτήσεων. - Λάθος µέγεθος στη malloc. Διορθώστε το µόνοι σας. Το sizeof(char) είναι το µέγεθος για µια µεταβλητή τύπου char. Θα έπρεπε να το πολλαπλασιάσετε µε το πλήθος των χαρακτήρων του πίνακα. = το µήκος του πίνακα(δεν µετράει το \0) + 1 ( η θέση για το \0) ). - Αν ο χρήστης δώσει κάτι διαφορετικό του y/n, θα πρέπει να ξαναζητάτε χαρακτήρα. (µε εσωτερική επανάληψη) Άσκηση 1η; 02111 PASS - Καλή στοίχιση και καλά ονόµατα µεταβλητών - Σωστή main - Σωστή free - Σωστή print - Στην union_str, στη malloc πρέπει να δεσµεύεσετε µια θέση ακόµη για το \0 - H char str σύµφωνα µε την εκφώνηση έπρεπε να ήταν const Άσκηση 2η; Την έχετε ξεκινήσει ωστόσο θέλει δουλειά ακόµα.προσπαθείστε να την τελειώσετε στο σπίτι new_string: - Σωστοί παράµετροι. - Σωστή δέσµευση µνήµης. - Η strncpy δεν τοποθετεί το '\0', οποτε έπρεπε να το βάλετε εσείς. str_print: - Σωστή υλοποίηση και σωστά αποφεύγετε την εκτύπωση NULL θέσεων. 02113 PASS free_str: main: - Σωστή ανάγνωση δεδοµένων και χρήση sprintf. - Σωστή κλήση συναρτήσεων. - Το πρόγραµµα παίρνει καινούριο string για οποιαδήποτε χαρακτήρα εκτός του n. Θα έπρεπε να ξαναζητάει µόνο για y. - Να έχετε πιο καλά ονόµατα µεταβλητών και σναρτήσεων. 02115 FAIL Υλοποιήθηκε πολύ µικρό µέρος της άσκησης - Καλά σχόλια. - Καλά ονόµατα µεταβλητών. - Το µέγεθος 13 για το formatstring θα έπρεπε να είναι σταθερά. - Σωστή χρήση scanf. 02116 PASS - Σωστό µέγεθος για την δέσµευση του νέου string. - Σωστή χρήση συναρτήσεων του string.h για την δηµιουργία του νέου string. - Σωστή εκτύπωση κενού string, για ακέραιο 0. - Λάθος print (Είναι δεύτερο εργαστήριο που δεν καταφέρνετε να εκτυπώσετε σωστά τους χαρακτήρες ""...!). - Σωστή αποδέσµευση µνήµης. - Καλή στοίχιση του κώδικα. - Τα ονόµατα των µεταβλητών θα µπορούσαν να είναι πιο περιγραφικά. - Σωστός ορισµός συναρτήσεων και χρήση του const. - Στη malloc δεν δεσµεύετε σωστά τις θέσεις µνήµης που χρειάζονται. 02117 PASS - Σωστός ο έλεγχος για τη malloc. - Σωστός ο τρόπος που διατρέχετε τον πίνακα για την εκτύπωσης. - Σωστή η απελευθέρωση µνήµης. - Σωστές οι συνθήκες για τα 2 loops. - Σωστή η χρήση της sprintf. - Η έξοδος του προγράµµατος είναι σωστή. Page 2
02118 FAIL - Κακά ονόµατα µεταβλητών(apeleutherosi mnimis;;) - Στην add, σωστή malloc, αλλά η strcat δε θα λειτουργήσει σωστά γιατί το newstring δεν έχει αρχικά \0 πουθενά. - Στη συνάρτηση εκτύπωσης έπρεπε να παρακάµπτετε τα NULL στοιχεία. - Δεν ελευθερώνετε όλη τη δυναµικά δεσµευµένη µνήµη. - Ο πίνακας δεικτών δεν έχει αρχικοποιηθεί. - H char str στην add σύµφωνα µε την εκφώνηση έπρεπε να ήταν const eksodos(): - Το όνοµα της συνάρτησης είναι παραπλανητικό. Καλείται όταν τερµατίζει το πρόγραµµα; Ένα καλύτερο όνοµα θα µπορούσε να είναι το 'ektypwsi'. 02121 PASS 02122 PASS main(): - Κακή στοίχιση στο εµφωλευµένο do-while. - Στην eksodos() η τιµή του counter δηλώνει τη θέση της τελευταίας έγκυρης καταχώρησης (i<=counter), ενώ στη clean_memory() η τιµή του counter δηλώνει το πλήθος των έγκυρων στοιχείων (i<counter). Να προσπαθείτε να φτιάχνετε όσο το δυνατόν συνεπείς διεπαφές µεταξύ των επαναχρησιµοποιούµενων υποµονάδων του προγράµµατός σας. -Λάθος στη while µε αποτέλεσµα να µην γίνεται επανάληψη και έλεγχος για "y" ή "n" - Σωστή χρήση const -Κακά-µη περιγραφικά ονόµατα κάποιων µεταβλητών και σχεδόν όλων των συναρτήσεων - Σωστή χρήση scanf. -Στην neo_str, στη malloc πρέπει να δεσµεύεσετε µια θέση ακόµη για το \0 - Σωστή επιστροφή NULL σε περίπτωση αποτυχίας της malloc Γενικά - Η συνάρτηση εκτύπωσης έχει όνοµα αναντίστοιχο µε την λειτουργία της. Συνάρτηση επεξεργασίας string - Σωστή χρήση της παραµέτρου const στο string όπως ζητάει η εκφώνιση. - Σωστός εντοπισµός της θέσης του χαρακτήρα και σωστός υπολογισµός του µήκους του string που θα αντιγραφεί. - Δεν κάνετε έλεγχο αποτυχίας της malloc. - Σωστή θέση του '\0' στην θέση που δείχνει ο δείκτης diaxwristhsp. Σωστή χρήση strcpy. - Σωστά επιστρέφετε NULL σε περίπτωση που δεν βρείτε το string. 02123 FAIL Συνάρτηση εκτύπωσης - H αύξηση του µετρητή i=i+2 είναι εντελώς λάθος. - Το µήνυµα "Could not create new string " είναι άσχετο. - Η αύξηση του µετρητή i=i+2 είναι εντελώς λάθος. Main - Η ανάνγωση του sting είναι λάθος καθώς πας να αποθηκεύσεις το string σε µία περιοχή µνήµης που δεν είναι αρχικοποιηµένη µε αποτέλεσµα να προκαλείται segmentation fault. - Σωστή ανάγνωση του χαρακτήρα. - Σωστή κλήση της συνάρτησης επεξεργασίας της συµβολοσειράς και αποθήκευση της επιστρεφόµενης τιµής της. - Σωστή κλήση της συνάρτησης εκτύπωσης. - Σωστά ελέγχετε εάν ο χρήστης δώσει κάτι διαφορετικό από 'y' ή 'n', επαναλαµβάνοντας το ερώτηµα προς τον χρήστη.. - Σωστά ελέγχετε εάν βγαίνετε εκτός των ορίων του πίνακα. Page 3
Γενικά - Η συνάρτηση εκτύπωσης έχει όνοµα αναντίστοιχο µε την λειτουργία της. Συνάρτηση επεξεργασίας string - Σωστή χρήση της παραµέτρου const στο string όπως ζητάει η εκφώνιση. - Σωστός εντοπισµός της θέσης του χαρακτήρα και σωστός υπολογισµός του µήκους του string που θα αντιγραφεί. - Δεν κάνετε έλεγχο αποτυχίας της malloc. - Σωστή θέση του '\0' στην θέση που δείχνει ο δείκτης diaxwristhsp. Σωστή χρήση strcpy. - Σωστά επιστρέφετε NULL σε περίπτωση που δεν βρείτε το string. 02124 FAIL Συνάρτηση εκτύπωσης - H αύξηση του µετρητή i=i+2 είναι εντελώς λάθος. - Το µήνυµα "Could not create new string " είναι άσχετο. - Η αύξηση του µετρητή i=i+2 είναι εντελώς λάθος. 02126 FAIL Main - Η ανάνγωση του sting είναι λάθος καθώς πας να αποθηκεύσεις το string σε µία περιοχή µνήµης που δεν είναι αρχικοποιηµένη µε αποτέλεσµα να προκαλείται segmentation fault. - Σωστή ανάγνωση του χαρακτήρα. - Σωστή κλήση της συνάρτησης επεξεργασίας της συµβολοσειράς και αποθήκευση της επιστρεφόµενης τιµής της. - Σωστή κλήση της συνάρτησης εκτύπωσης. - Σωστά ελέγχετε εάν ο χρήστης δώσει κάτι διαφορετικό από 'y' ή 'n', επαναλαµβάνοντας το ερώτηµα προς τον χρήστη.. - Σωστά ελέγχετε εάν βγαίνετε εκτός των ορίων του πίνακα. - Το όνοµα first_function δεν είναι περιγραφικό - Δεν αφαιρείτε το \n που διαβάζει η fgets, άµεσα. Φαίνεται να το κάνετε στην first_function (που δεν είναι δουλειά της) και χωρίς να ελέγξετε αν όντως υπάρχει. - Λάθος µέγεθος στη malloc. - Η πρώτη θέση ενός πίνακα είναι η 0, όχι η 1 - Αν ο χρήστης δώσει κάτι διαφορετικό του y/n, πρέπει να ξαναζητάτε χαρακτήρα - Λάθος αποδέσµευση µνήµης - Σωστή κλήση συναρτήσεων - Λάθος υλοποίηση print - Η επέκταση του αρχείου έπρεπε να ήταν.tgz - Καθόλου σχόλια! copy_string(): - Στη malloc() έπρεπε να δεσµεύατε ένα ακόµη byte για το '\0'. - Ο έλεγχος για τον pointer που επιστρέφει η malloc() πρέπει να γίνεται ΠΡΙΝ τη χρήση του. Εάν αποτύχει η malloc() (π.χ. πολύ µεγάλη ή αρνητική τιµή της δεύτερης παραµέτρου), το πρόγραµµα δεν τρέχει σωστά. - Δεν αρχικοποιείτε τη δυναµική µνήµη σε κενή συµβολοσειρά για να δουλέψει σωστά η strcat(). 02128 FAIL print_str(): - Η στοίχιση στο σώµα του if δεν είναι σωστή. free_memory(): - Έπρεπε να περνάτε ως παράµετρο τον πίνακα από pointers και να ελευθερώνετε τα στοιχεία του. main(): - Κακή στοίχιση! - Δεν περιορίζετε το µέγεθος της εισόδου του χρήστη µε τη χρήση κατάλληλου format string στη scanf(). - Χρησιµοποιείτε µόνο την πρώτη θέση του πίνακα για αποθήκευση (δεν αλλάζετε τιµή στο i). Page 4
02129 οριακό PASS lab12grades str_antigrafa(): - Δεν αρχικοποιείτε τη δυναµική µνήµη σε κενή συµβολοσειρά έτσι ώστε να δουλέψει σωστά η strcat(). output_mtrs(): - Είναι προτιµότερο να κάνετε τόσες επαναλήψεις όσο και το µέγεθος του πίνακα (εφόσον το γνωρίζετε) και να ελέγχετε εντός εάν το εκάστοτε στοιχείο ικανοποιεί οποιεσδήποτε συνθήκες. free_matrix(): - Δεν ελευθερώνετε τη δυναµική µνήµη (τα στοιχεία του πίνακα που περνάτε ως παράµετρο). main(): - Δεν αφαιρείτε τον χαρακτήρα αλλαγής γραµµής που εισάγεται µε την fgets(). Η scanf() αποτελεί καλύτερη επιλογή για τη µορφή της συγκεκριµένης εισόδου. - Οι κενές θέσεις του πίνακα δεν έχουν την τιµή NULL. - Το c δεν είναι περιγραφικό όνοµα. - Η επανάληψη ανάγνωσης του c µε getchar() είναι ελλιπής. Δεν καταναλώνετε τον χαρακτήρα αλλαγής γραµµής ο οποίος εισάγεται από το πληκτρολόγιο. - Στη περίπτωση που ο χρήστης εισάγει 'n', το πρόγραµµα τερµατίζει χωρίς να αποδεσµεύσει τη δυναµική µνήµη. - Η συνθήκη στο εξωτερικό do-while πρέπει να είναι while(i<array_size && c=='y'). string_space: - Σωστοί παράµετροι. - Για το νέο string δεσµεύετε µια θέση λιγότερη και δεν έχετε θέση για το '\0'. ektupwsh: - Σωστή υλοποίηση και σωστά αποφεύγετε την εκτύπωση NULL θέσεων. 02130 PASS svisimo: main: - Θα έπρεπε να γίνει χρήση της sprintf. - Η συνάρτηση ektupwsh θα έπρεπε να καλείται σε κάθε επανάληψη. - Το πρόγραµµα θα έπρεπε να τερµατίζει και όταν ο πίνακας έχει γεµίσει. - Σωστά ονόµατα µεταβλητών και συναρτήσεων -Καλή στοίχιση και καλά ονόµατα εκτός από το multiply!! -Στην multiply, στη malloc πρέπει να δεσµεύεσετε µια θέση ακόµη για το \0 02131 PASS - Σωστή χρήση const -Λάθος free.την αφαιρέσατε ως σχόλια και έτσι η µνήµη δεν ελευθερώνεται -Σωστά αφαιρείτε το \n στην fgets - Σωστή print - Η υλοποίηση της συνάρτηση επεξεργασίας του string είναι σωστή αλλά δεν έχετε βάλει const στις παραµέτρους της συνάρτησης και συγκεκριµένα στο string που περνάτε σαν όρισµα. - στην malloc που χρησιµοποιήσατε, δεν έχετε αφήσει χώρο για το \0 το οποίο επίσης δεν βάζετε στο τέλος. - σωστά επιστρέφετε NULL σε περίπτωση που δεν βρει τον χαρακτήρα - στον πίνακα απο strings, σε περίπτωση που δεν βρίσκετε κάποιον χαρακτήρα, αφήνετε τη θέση 02134 του πίνακα κενή και µάλιστα αναρχικοποίητη. Θα ήταν καλύτερο, να αυξάνετε τον µετρήτή για τον Οριακό PASS πίνακα µόνο οταν είστε σίγουροι οτι υπάρχει ο χαρακτήρας µέσα στο string. - H συνάρτηση που εκτυπώνει είναι σωστή µόνο όταν υπάρχουν πάντα οι split χαρακτήρες µέσα στα string. - H συνάρτηση απελευθέρωσης της µνήµης είναι σωστή. - σωστά χρησιµοποιήσατε το formatstring - σωστή και η κλήση της συνάρτησης. - η συνθήκη για έξοδο είναι και αυτή σωστή. -Δεν εκτυπώνεται τίποτα από τα ζητούµενα - Το πρόγραµµα σας µε την έκκινηση δίνει segmentation fault! 02138 FAIL - Λάθη στη new string και στο malloc -Μη περιγραφικά ονόµατα συναρτήσεων Page 5
02139 PASS - Σωστή main - Σωστή free - Σωστή print - Στην create_string, στη malloc πρέπει να δεσµεύεσετε µια θέση ακόµη για το \0 - Το new_string είναι δείκτης. Η ανάθεση του χαρακτήρα '\0' σε αυτόν δεν είναι σωστή (αν και τελικά τον κάνει NULL). Έπρεπε να κατασκευάζετε και να επιστρέφετε το "" σε περίπτωση που ο αριθµός είναι µηδέν. - Καλή στοίχιση και καλά ονόµατα, εκτός από την παράµετρο i στη συνάρτηση. Γενικά - Αποδεκτή επιλογή ονοµάτων µεταβλητών και συναρτήσεων. 02140 Οριακό PASS Συνάρτηση εκτύπωσης Συνάρτηση επεξεργασίας του string - Δεν χρησιµοποιείτε την παράµετρο const στο string όπως ζητάει η εκφώνηση. - Σωστός εντοπισµός της θέσης του χαρακτήρα. - Λάθος υπολογισµός του µήκους του string που θα αντιγραφεί. Αγνοείτε το '\0' στο τέλος. - Δεν κάνετε έλεγχο αποτυχίας της malloc. - Η strncpy δεν βάζει τον χαρακτήρα '\0' στο τέλος, πράγµα που πρέπει να το κάνετε εσείς. Το πρόγραµµα σας δουλεύει διότι η επόµενη θέση από την µνήµη που δεσµεύει η malloc περιέχει µε µεγάλη πιθανότητα τον χαρακτήρα '\0'. Δεν παύει να δουλεύει όµως κατά τύχη. - Σωστά επιστρέφετε NULL σε περίπτωση που δεν βρείτε το string. 02143 PASS Main - Σωστή ανάγνωση string και χαρακτήρα. - Σωστή κλήση της συνάρτησης επεξεργασίας της συµβολοσειράς και αποθήκευση της επιστρεφόµενης τιµής της. - Σωστή αύξηση του µετρητή i. - Σωστή κλήση της συνάρτησης εκτύπωσης. - Σωστός έλεγχος αν ο χρήστης δώσει κάτι διαφορετικό από 'y' ή 'n'. - Σωστός έλεγχος αν η ανακύκλωση βγαίνει εκτός των ορίων του πίνακα καθώς και εάν ο χρήστης έχει εισάγει 'y' στην επιλογή "More(y/n)? ". -Σωστή στοίχιση σωστά ονόµατα µεταβλητών -Σωστοί παράµετροι και υλοποίηση της συνάρτησης Επεξεργασίας του string αλλά δε δεσµεύετε θέση για το /0 -Σωστή συνάρτηση εκτύπωσης και απελευθέρωσης µνήµης -Σωστή ανάγνωση δεδοµένων κλήση συναρτήσεων και συνθηκών loop Page 6
Άσκηση 1 ----------------- Γενικά - Καλή επιλογή ονοµάτων µεταβλητών και συναρτήσεων. Συνάρτηση επεξεργασίας string - Σωστός εντοπισµός της θέσης του χαρακτήρα µε χρήση της strchr και σωστός έλεγχος εάν η strchr αποτυχγάνει. - Σωστός υπολογισµός του απαραίτητου µεγέθους δέσµευσης µνήµης και σωστή δέσµευση µνήµης µέσω της malloc. - Σωστός έλεγχος αποτυχίας της malloc. - Σωστή αντιγραφή µε χρήσης της strncpy. - Λάθος προσδιορισµός της θέσης για τον χαρακτήρα '\0'. Το σωστό είναι *(new_str+del_ptr-string) ή new_str[del_ptr-string] (ξεκινώντας από 0 έως del_ptr-string έχουµε συνολικά del_ptr-string+1 θέσεις). Συνάρτηση εκτύπωσης - Σωστη υλοποίηση µε δεδοµένο ότι δεν αποθηκεύετε την επιστρεφόµενη τιµή NULL στον πίνακα. 02144 PASS - Σωστη υλοποίηση. Main - Η αρχικοποίηση του πίνακα σε NULL δεν είναι λάθος αλλά δεν είναι και απαραίτητη. - Σωστή ανάγνωση string και χαρακτήρα µε χρήση του format_string. - Σωστή κλήση της συνάρτησης επεξεργασίας της συµβολοσειράς και αποθήκευση της επιστρεφόµενης τιµής της. - Σωστή αύξηση της µεταβλητής size υπό συνθήκη. - Σωστή κλήση της συνάρτησης εκτύπωσης. - Σωστά ελέγχετε εάν ο χρήστης δώσει κάτι διαφορετικό από 'y' ή 'n' και ξαναρωτάτε τον χρήστη. Σωστά κάνετε break εάν απαντήσει 'n'. - Σωστά ελέγχετε στο while εάν βγαίνει το πρόγραµµα εκτός των ορίων του πίνακα και τερµατίζετε την ανακύκλωση. Άσκηση 2 ----------------- Σωστή υλοποίηση µε εξαίρεση το γεγονός ότι δεν ακολουθήσατε την εκφώνιση που έλεγε τα εξής: "Μεταβάλετε τον πίνακα από δείκτες σε χαρακτήρα έτσι ώστε να είναι πίνακας από δείκτες σε struct". Αυτό σηµαίνει ότι δεν ορίζετε ένα πίνακα από structs, αλλά ένα πίνακα από δείκτες, δηλ. struct data *array[array_size]; Στη συνέχεια για κάθε στοιχείο του πίνακα θα πρέπει να δεσµεύσετε την απαραίτητη µνήµη για το struct πριν προχωρήσετε στην δέσµευση της µνήµης για τα επιµέρους πεδία. Page 7
02145 οριακό PASS lab12grades str_antigrafa(): - Δεν αρχικοποιείτε τη δυναµική µνήµη σε κενή συµβολοσειρά έτσι ώστε να δουλέψει σωστά η strcat(). output_mtrs(): - Είναι προτιµότερο να κάνετε τόσες επαναλήψεις όσο και το µέγεθος του πίνακα (εφόσον το γνωρίζετε) και να ελέγχετε εντός εάν το εκάστοτε στοιχείο ικανοποιεί οποιεσδήποτε συνθήκες. free_matrix(): - Δεν ελευθερώνετε τη δυναµική µνήµη (τα στοιχεία του πίνακα που περνάτε ως παράµετρο). main(): - Δεν αφαιρείτε τον χαρακτήρα αλλαγής γραµµής που εισάγεται µε την fgets(). Η scanf() αποτελεί καλύτερη επιλογή για τη µορφή της συγκεκριµένης εισόδου. - Οι κενές θέσεις του πίνακα δεν έχουν την τιµή NULL. - Το c δεν είναι περιγραφικό όνοµα. - Η επανάληψη ανάγνωσης του c µε getchar() είναι ελλιπής. Δεν καταναλώνετε τον χαρακτήρα αλλαγής γραµµής ο οποίος εισάγεται από το πληκτρολόγιο. - Στη περίπτωση που ο χρήστης εισάγει 'n', το πρόγραµµα τερµατίζει χωρίς να αποδεσµεύσει τη δυναµική µνήµη. - Η συνθήκη στο εξωτερικό do-while πρέπει να είναι while(i<array_size && c=='y'). Page 8
Άσκηση 1 ----------------- Γενικά - Καλή επιλογή ονοµάτων µεταβλητών και συναρτήσεων. Συνάρτηση επεξεργασίας string - Σωστός εντοπισµός της θέσης του χαρακτήρα µε χρήση της strchr και σωστός έλεγχος εάν η strchr αποτυχγάνει. - Σωστός υπολογισµός του απαραίτητου µεγέθους δέσµευσης µνήµης και σωστή δέσµευση µνήµης µέσω της malloc. - Σωστός έλεγχος αποτυχίας της malloc. - Σωστή αντιγραφή µε χρήσης της strncpy. - Λάθος προσδιορισµός της θέσης για τον χαρακτήρα '\0'. Το σωστό είναι *(new_str+del_ptr-string) ή new_str[del_ptr-string] (ξεκινώντας από 0 έως del_ptr-string έχουµε συνολικά del_ptr-string+1 θέσεις). Συνάρτηση εκτύπωσης - Σωστη υλοποίηση µε δεδοµένο ότι δεν αποθηκεύετε την επιστρεφόµενη τιµή NULL στον πίνακα. 02146 PASS - Σωστη υλοποίηση. Main - Η αρχικοποίηση του πίνακα σε NULL δεν είναι λάθος αλλά δεν είναι και απαραίτητη. - Σωστή ανάγνωση string και χαρακτήρα µε χρήση του format_string. - Σωστή κλήση της συνάρτησης επεξεργασίας της συµβολοσειράς και αποθήκευση της επιστρεφόµενης τιµής της. - Σωστή αύξηση της µεταβλητής size υπό συνθήκη. - Σωστή κλήση της συνάρτησης εκτύπωσης. - Σωστά ελέγχετε εάν ο χρήστης δώσει κάτι διαφορετικό από 'y' ή 'n' και ξαναρωτάτε τον χρήστη. Σωστά κάνετε break εάν απαντήσει 'n'. - Σωστά ελέγχετε στο while εάν βγαίνει το πρόγραµµα εκτός των ορίων του πίνακα και τερµατίζετε την ανακύκλωση. Άσκηση 2 ----------------- Σωστή υλοποίηση µε εξαίρεση το γεγονός ότι δεν ακολουθήσατε την εκφώνιση που έλεγε τα εξής: "Μεταβάλετε τον πίνακα από δείκτες σε χαρακτήρα έτσι ώστε να είναι πίνακας από δείκτες σε struct". Αυτό σηµαίνει ότι δεν ορίζετε ένα πίνακα από structs, αλλά ένα πίνακα από δείκτες, δηλ. struct data *array[array_size]; Στη συνέχεια για κάθε στοιχείο του πίνακα θα πρέπει να δεσµεύσετε την απαραίτητη µνήµη για το struct πριν προχωρήσετε στην δέσµευση της µνήµης για τα επιµέρους πεδία. - Η υλοποίηση της συνάρτηση επεξεργασίας του string είναι σωστή και έχετε βάλει const στις παραµέτρους της συνάρτησης και συγκεκριµένα στο string που περνάτε σαν όρισµα. - στην malloc που χρησιµοποιήσατε έχετε αφήσει χώρο για το \0. Σωστά βάζετε το \0 στο τέλος. - σωστά επιστρέφετε NULL σε περίπτωση που δεν βρει τον χαρακτήρα - σωστά ελέγχετε αν αποτυγχάνει η malloc. - στον πίνακα απο strings, σε περίπτωση που δεν βρίσκετε κάποιον χαρακτήρα σωστά δεν αφήνετε τη θέση του πίνακα κενή - πολύ σηµαντικό λάθος είναι οτι έχετε ξεχάσει να αυξάνετε το i κάθε φορά που βάζετε κάτι στον 02147 Οριακό PASS πίνακα - H συνάρτηση που εκτυπώνει είναι σωστή - H συνάρτηση απελευθέρωσης της µνήµης είναι λάθος, θα πρέπει να γίνεται στο τέλος του προγράµµατος και όχι εντός του loop - σωστά χρησιµοποιήσατε το formatstring - η κλήση των συναρτήσεων για την εκτύπωση είναι σωστή αλλά λίγο µπερδεµένη. Θα µπορούσατε να την είχατε κάνει πιο απλή. - η συνθήκη για έξοδο είναι αυτή σωστή. Page 9
new_string: - Σωστοί παράµετροι, όµως το string έπρεπε να το περνάτε ως const. - Σωστή δέσµευση για το νέο string. - Θα έπρεπε να επιστρέφετε NULL άµα αποτύγχανε η strchr. print_non_null - Σωστή υλοποίηση και σωστά αποφεύγετε την εκτύπωση NULL θέσεων. 02148 PASS free_dym_alloc: 02156 PASS main: - Σωστή ανάγνωση δεδοµένων και χρήση sprintf. - Σωστή κλήση συναρτήσεων. - Σωστό loop. - Σωστά ονόµατα µεταβλητών και σναρτήσεων Σωστή στοίχιση. - Η υλοποίηση της συνάρτηση επεξεργασίας του string είναι σωστή και έχετε βάλει const στις παραµέτρους της συνάρτησης και συγκεκριµένα στο string που περνάτε σαν όρισµα. - στην malloc που χρησιµοποιήσατε έχετε αφήσει χώρο για το \0. Σωστά βάζετε το \0 στο τέλος. - σωστά επιστρέφετε NULL σε περίπτωση που δεν βρει τον χαρακτήρα - σωστά ελέγχετε αν αποτυγχάνει η malloc. - στον πίνακα απο strings, σε περίπτωση που δεν βρίσκετε κάποιον χαρακτήρα σωστά δεν αφήνετε τη θέση του πίνακα κενή - πολύ σηµαντικό λάθος είναι οτι έχετε ξεχάσει να αυξάνετε το i κάθε φορά που βάζετε κάτι στον 02153 Οριακό PASS πίνακα - H συνάρτηση που εκτυπώνει είναι σωστή - H συνάρτηση απελευθέρωσης της µνήµης είναι λάθος, θα πρέπει να γίνεται στο τέλος του προγράµµατος και όχι εντός του loop - σωστά χρησιµοποιήσατε το formatstring - η κλήση των συναρτήσεων για την εκτύπωση είναι σωστή αλλά λίγο µπερδεµένη. Θα µπορούσατε να την είχατε κάνει πιο απλή. - η συνθήκη για έξοδο είναι αυτή σωστή. - Καλά σχόλια, καλός θα ήταν και ο επιµέρους σχολιασµός των συναρτήσεων. - Καλά ονόµατα µεταβλητών. - Λάθος, το format για την scanf θα έπρεπε να το είχατε κατασκεύασει δυναµικά µε sprintf. - Σωστή χρήση scanf. - Πολύπλοκη λογική, για την είσοδο συνέχειας ή εξόδου από τον χρήστη. Μπορεί να υλοποιηθεί πολύ πιο απλά. - Λάθος µέγεθος για την δέσµευση του νέου string. Παραλείψατε ένα έξτρα χαρακτήρα για το τέλος του string ('\0'). Το οτι δουλεύει είναι καθαρά θέµα υλοποίησης του linux. - Λάθος χρήση του strcat αφού δεν έχετε εισάγε στην αρχή του νέου string τον χαρακτήρα '\0'. Δεύτερη φορά που σταθήκατε τυχεροί! - Σωστή εκτύπωση κενού string, για ακέραιο 0. - Σωστή έξοδος. - Σωστή αποδέσµευση µνήµης. 02157 FAIL Το.c είναι εκτελέσιµο αρχείο. Page 10
Άσκηση 1 ----------------- Γενικά - Καλή επιλογή ονοµάτων µεταβλητών και συναρτήσεων. Συνάρτηση επεξεργασίας string (new_string) - Σωστός εντοπισµός της θέσης του χαρακτήρα µε χρήση της strchr και σωστός έλεγχος εάν η strchr αποτυγχάνει. - Λάθος υπολογισµός του απαραίτητου µεγέθους δέσµευσης µνήµης. Το σωστό είναι size+1 υπολογίζοντας και τον χαρακτήρα '\0' στο τέλος του string. - Σωστή δέσµευση µνήµης µέσω της malloc και σωστός έλεγχος αποτυχίας της malloc. - Σωστή αντιγραφή µε χρήσης της strncpy. - Παραλείπετε να προσθέσετε τον χαρακτήρα '\0' στον τέλος του string που αντιγράψατε. H strncpy δεν προσθέτει τον χαρακτήρα '\0' στο τέλος. Συνάρτηση εκτύπωσης - Σωστή υλοποίηση µε δεδοµένο ότι δεν αποθηκεύετε την επιστρεφόµενη τιµή NULL στον πίνακα µέσα στη main(). - Σωστή η χρήση διπλού pointer αντί για πίνακα δεικτών ως παράµετρο στη συνάρτηση. - Σωστή υλοποίηση µε δεδοµένο ότι δεν αποθηκεύετε την επιστρεφόµενη τιµή NULL στον πίνακα µέσα στη main(). - Σωστή η χρήση διπλού pointer αντί για πίνακα δεικτών ως παράµετρο στη συνάρτηση. 02158 PASS Main - Σωστή ανάγνωση string και χαρακτήρα µε χρήση του format_string. - Σωστή κλήση της συνάρτησης επεξεργασίας της συµβολοσειράς και αποθήκευση της επιστρεφόµενης τιµής της. - Σωστή αύξηση της µεταβλητής i (µετρητής) υπό συνθήκη. - Σωστή κλήση της συνάρτησης εκτύπωσης. - Σωστά ελέγχετε εάν ο χρήστης δώσει κάτι διαφορετικό από 'y' ή 'n' και ξαναρωτάτε τον χρήστη. - Σωστά ελέγχετε στο while εάν βγαίνει το πρόγραµµα εκτός των ορίων του πίνακα και τερµατίζετε την ανακύκλωση. - Σωστά καλείτε τη συνάρτηση απελευθέρωσης µνήµης πριν τον τερµατισµό του προγράµµατος. Άσκηση 2 ----------------- main() - Σωστά δηµιουργείτε το sruct. - Σωστά ορίζετε τον πίνακα από structs. - Δεσµεύετε µνήµη για κάθε ανακλύκλωση ανεξάρτητα αν αυξήθηκε το i ή όχι. Eάν δεν αυξηθεί το i δεσµεύετε µνήµη δύο ή περισσότερες φορές για την ίδια µεταβλητή χωρίς να απελευθερώνετε την παλιά. - ptr[i]->new=(char*)malloc(str_size*sizeof(char)); Ξαναδεσµεύετε µνήµη που ήδη δεσµεύσατε µέσα στη συνάρτηση new_string(). - ptr[i]->new=new; Η συγκεκριµένη εντολή δεν συνιστά αντιγραφή αλλά ανάθεση pointer. Λειτουργεί γιατί έχετε αναθέσει µνήµη µέσα στη συνάρτηση new_string(). Η malloc της προηγούµενης γραµµής είναι λάθος και δηµιουργεί memory leak στο πρόγραµµα σας. Συνάρτηση εκτύπωσης - Σωστή η χρήση διπλού pointer σε struct αντί για πίνακα δεικτών ως παράµετρο στη συνάρτηση. - Σωστή υλοποίηση µε δεδοµένο ότι δεν αποθηκευετε την επιστρεφόµενη τιµή NULL στον πίνακα µέσα στη main(). - Σωστή η χρήση διπλού pointer σε struct αντί για πίνακα δεικτών ως παράµετρο στη συνάρτηση. Ξαναδείτε τη σειρά της δυναµικής δέσµευσης µνήµης για την 2η Άσκηση. Συνιστάται το αρχικό διάβασµα να µην το κάνετε σε συνδυασµό µε δυναµική δέσµευση µνήµης αλλά στατικά. Εφόσον αποφασίσετε ότι θέλετε αν αποθηκεύσετε το string στον πίνακα τότε προχωρήστε στις απαραίτητες δεσµεύσεις µνήµης. Page 11
02159 PASS 02160 οριακό PASS lab12grades -Καλή στοίχιση και καλά ονόµατα εκτός από το multiply!! -Στην multiply, στη malloc πρέπει να δεσµεύεσετε µια θέση ακόµη για το \0 - Σωστή χρήση const -Λάθος free.την αφαιρέσατε ως σχόλια και έτσι η µνήµη δεν ελευθερώνεται -Σωστά αφαιρείτε το \n στην fgets - Σωστή print -Σωστή στοίχιση σωστά ονόµατα µεταβλητών εκτός του str1 -Σωστοί παράµετροι και υλοποίηση της συνάρτησης επεξεργασίας του string αλλά δε δεσµεύετε θέση για το /0 -Δεν ελέγχετε άµα αποτύχει η malloc να επιστρέφει NULL συνάρτηση. -Δεν υλοποιείτε σωστά τη συνάρτηση εκτύπωσης. -Σωστή η συνάρτηση απελευθέρωσης µνήµης αλλά δεν την καλείτε στο σωστό σηµείο. -Δεν έχετε σωστές συνθήκες loop new_string: - Σωστοί παράµετροι, όµως το string έπρεπε να το περνάτε ως const. - Σωστή δέσµευση για το νέο string. - Θα έπρεπε να επιστρέφετε NULL άµα αποτύγχανε η strchr. print_non_null - Σωστή υλοποίηση και σωστά αποφεύγετε την εκτύπωση NULL θέσεων. 02161 PASS free_dym_alloc: main: - Σωστή ανάγνωση δεδοµένων και χρήση sprintf. - Σωστή κλήση συναρτήσεων. - Σωστό loop. - Σωστά ονόµατα µεταβλητών και σναρτήσεων Page 12
Γενικά - Καλή επιλογή ονοµάτων µεταβλητών και συναρτήσεων. Συνάρτηση επεξεργασίας string - Σωστός εντοπισµός της θέσης του χαρακτήρα µε χρήση της strchr και σωστός έλεγχος εάν η strchr αποτυχγάνει. - Σωστός υπολογισµός του απαραίτητου µεγέθους µνήµης και σωστή δέσµευση µνήµης µέσω της malloc. - Σωστός έλεγχος αποτυχίας της malloc. - Σωστή αντιγραφή µε χρήσης της strncpy. - Παραλείπετε να προσθέσετε τον χαρακτήρα '\0' στον τέλος του string που αντιγράψατε. H strncpy δεν προσθέτει τον χαρακτήρα '\0' στο τέλος. Συνάρτηση εκτύπωσης - Σωστη υλοποίηση. 02162 PASS - Σωστη υλοποίηση. Main - H αρχικοποίηση του πίνακα σε NULL δεν είναι λάθος αλλά δεν είναι και απραίτητη. - Σωστή ανάγνωση string και χαρακτήρα. - Σωστή κλήση της συνάρτησης επεξεργασίας της συµβολοσειράς και αποθήκευση της επιστρεφόµενης τιµής της. - Σωστή αύξηση του i υπό συνθήκη. - Σωστή κλήση της συνάρτησης εκτύπωσης. Θα µπορούσατε αντί για ARRAY_SIZE να βάλετε τον αριθµό των αποθηκευµένων στοιχείων στον πίνακα. - Σωστά ελέγχετε εάν ο χρήστης δώσει κάτι διαφορετικό από 'y' ή 'n' και ξαναρωτάτε τον χρήστη. Σωστά κάνετε break εάν απαντήσει 'n'. - Σωστά ελέγχετε στο while εάν βγαίνει το πρόγραµµα εκτός των ορίων του πίνακα και τερµατίζετε την ανακύκλωση. - Σωστή κλήση της συνάρτησης για την απελευθέρωση της µνήµης. 02163 PASS 02165 FAIL new_str(): - Στη malloc() έπρεπε να δεσµεύατε ένα ακόµη byte για το '\0'. - Ελλιπής στοίχιση στο κλείσιµο του if. - Εάν ο αριθµός επαναλήψεων είναι µηδέν, γράφετε εκτός ορίων. Σε αυτή την περίπτωση πρέπει να κατασκευάζεται η κενή συµβολοσειρά "". Να αποφεύγετε να ζητάτε δυναµική µνήµη µεγέθους µηδέν µε κατάλληλους ελέγχους. - Δεν παράγει εκτελέσιµο, έχει errors τα οποία δυστυχώς είναι πολύ βασικά. - Έχετε λάθη στη σύνταξη της printf (γραµµές 16-22). - Έχετε λάθος στη σύνταξη της for (j=0,j = i - 1, j++). Tο j = i - 1 που βάλατε δεν ειναι συνθήκη, είναι καταχώρηση τιµής. Και τις εντολές τις διαχωρίζουµε µε ; όχι µε, Page 13
02166 Οριακό PASS lab12grades Γενικά - Αποδεκτή επιλογή ονοµάτων µεταβλητών και συναρτήσεων. Συνάρτηση επεξεργασίας string - Λάθος µήκος δεσµευµένης µνήµης. Δεν υπολογίζετε το '\0' που χρειάζεται το string σας. - Σε περίπτωση που αποτυγχάνει η strchr επιχειρείτε στη συνέχεια να κάνετε malloc πράγµα που µε µεγάλη πιθανότητα επίσης αποτυγχάνει. Τελικά καταλήγετε µε λάθος µήνυµα προς τον χρήστη. Το ορθό θα ήταν η ενότητα του else if να προηγείται της ενότητας του if. - Σωστή χρήση strncpy. - Η εντολή nstring[ptr_chr-string]='\0'; γράφει εκτός των ορίων της µνήµης που έχετε δεσµεύσει. Συνάρτηση εκτύπωσης - Η συνάρτηση εκτύπωσης αν και ελέγχει για NULL θα έπρεπε να συνεχίζει στην επόµενη ανακύκλωση και όχι να σταµατά µε break. - Δεν εκτυπώνετε διπλά εισαγωγικά πριν και µετά από κάθε συµβολοσειρά. 02168 PASS 02169 PASS Main - Η αύξηση του µετρητή i στην αρχή του while() είναι λάθος. - Σωστή ανάγνωση string και χαρακτήρα. - Σωστή κλήση της συνάρτησης επεξεργασίας της συµβολοσειράς και αποθήκευση της επιστρεφόµενης τιµής της. Δεν ζητείται να εκτυπώνετε το string που αποθηκεύετε. - Σωστή κλήση της συνάρτησης εκτύπωσης αν και δεν εκτυπώνει ποτέ τίποτε!!! (Γιατί?) - Δεν ελέγχετε εάν ο χρήστης δώσει κάτι διαφορετικό από 'ν' πράγµα που είναι λάθος. - Σωστά ελέγχετε εάν βγαίνετε εκτός των ορίων του πίνακα. - Όταν διαβάζουµε string µε scanf πρέπει πάντα να βάζουµε περιορισµό µεγέθους στο format string! - Στη while για το More (y/n) δε χρειάζεται η τελική if. Αµέσως µετά ελέγχει τη συνθήκη της while και θα βγει από αυτή έχει δοθεί n - Κατά τα άλλα πολύ καλή δουλειά. spacer: - Το string έπρεπε να το παιρνάτε ως const. - Αρχικά θα έπρεπε να κοιτάτε αν έχει βρεθεί ο χαρακτήρας µε strchr και µετά να κάνετε malloc. - Δε έχετε δεσµεύσει χώρο για το '\0'. - Η strncpy δεν τοποθετεί το '\0', οποτε έπρεπε να το βάλετε εσείς. - Στη strncpy δε χρειάζεται το sizeof(char). print: - Σωστή υλοποίηση και σωστά αποφεύγετε την εκτύπωση NULL θέσεων. free_func: main: - Σωστή ανάγνωση δεδοµένων και χρήση sprintf. - Σωστή κλήση συναρτήσεων. - Σωστό loop. 02171 PASS - Σωστά ονόµατα µεταβλητών και συναρτήσεων. - Καλά σχόλια, καλός θα ήταν και ο επιµέρους σχολιασµός των συναρτήσεων. - Καλά ονόµατα µεταβλητών. - Σωστές σταθερές. - Σωστή χρήση scanf. - Σωστό µέγεθος για την δέσµευση του νέου string. - Σωστή χρήση συναρτήσεων του string.h για την δηµιουργία του νέου string. - Σωστή εκτύπωση κενού string, για ακέραιο 0. - Σωστή έξοδος. - Σωστή αποδέσµευση µνήµης. - Καλή δουλειά. Page 14
Γενικά πολύ καλή δουλειά. lab12grades 02172 PASS 02173 PASS - Καλή στοίχιση του κώδικα. - Καλά ονόµατα µεταβλητών και ο ορισµός σταθερών. - Σωστός ορισµός συναρτήσεων και χρήση του const. - Σωστή χρήση της malloc. - Σωστός ο έλεγχος για τη malloc. - Σωστός ο τρόπος που διατρέχετε τον πίνακα για την εκτύπωσης αλλά επρεπε να τον εκτυπώνετε κάθε φορά που ο χρήστης έδινε µία νέα συµβολοσειρά. - Σωστή η απελευθέρωση µνήµης. - Σωστές οι συνθήκες για τα 2 loops. - Καλή η χρήση της fgets. - Η έξοδος του προγράµµατος είναι σωστή. string_pol(): - Η strlen() δεν µετράει το '\0'. Το µέγεθος της δυναµικής µνήµης που ζητάτε είναι µικρότερο από αυτό που χρειάζεστε, µε αποτέλεσµα να γίνονται εγγραφές εκτός ορίων. print_pointers(): - Πριν χρησιµοποιήσετε την strcmp() πρέπει να ελέγξετε εάν η πρώτη παράµετρος είναι!= NULL. - Η κενή συµβολοσειρά µπορεί να γραφτεί απλά ως "" (δηλαδή κανένας χαρακτήρας + '\0'), αντί "\0" (ο χαρακτήρας '\0' + '\0'). main(): - Το όνοµα integer δεν είναι περιγραφικό. - Στην print_pointers() η τιµή του megethos δηλώνει τη θέση της τελευταίας έγκυρης καταχώρησης (i<=megethos), ενώ στη memory_release() η τιµή του megethos δηλώνει το πλήθος των έγκυρων στοιχείων (i<megethos). Να προσπαθείτε να φτιάχνετε όσο το δυνατόν συνεπείς διεπαφές µεταξύ των επαναχρησιµοποιούµενων υποµονάδων του προγράµµατός σας. - Σωστή η συνάρτηση function, αλλά έχει ΑΠΑΡΑΔΕΚΤΟ όνοµα - Δεν υλοποιήσατε τις άλλες 2 συναρτήσεις που χρειαζόταν η άσκηση. Ολοκληρώστε τη στο σπίτι. 02174 FAIL Στη main: - Αφήνουµε ΚΕΝΟ στην scanf (για να µη διαβάσει το enter) γραµµή 29 ' %c'! - Η συνθήκη στην επανάληψη (γραµµή 31) έπρεπε να είναι &&, δηλαδή επανέλαβε όσο το selection είναι διαφορετικό από y και n. - Στην εξωτερική επανάληψη (γραµµή 33) θα πρεπει να υπάρχει και µια συνθήκη ώστε τα inputs < ARRAY_SIZE. Άσκηση 1η; 02178 PASS - Καλή στοίχιση και καλά ονόµατα µεταβλητών - Σωστή main - Σωστή free - Σωστή print - Στην union_str, στη malloc πρέπει να δεσµεύεσετε µια θέση ακόµη για το \0 - H char str σύµφωνα µε την εκφώνηση έπρεπε να ήταν const 02179 οριακό PASS Άσκηση 2η; Την έχετε ξεκινήσει ωστόσο θέλει δουλειά ακόµα.προσπαθείστε να την τελειώσετε στο σπίτι - Καλά σχόλια. - Καλά ονόµατα µεταβλητών. - Το µέγεθος 13 για το formatstring θα έπρεπε να είναι σταθερά. - Η scanf δεν διαβάζει τον χαρακτήρα '\n' οπότε ήταν περιττό να προσπαθείτε να τον εξαλείψετε. - Σωστό µέγεθος για την δέσµευση του νέου string. - Σωστή χρήση συναρτήσεων του string.h για την δηµιουργία του νέου string. - Λάθος, για ακέραιο 0 το πρόγραµµά σας ακόµη εκτυπώνει 1 φορά το παλίο string στον καινουργιό. - Λάθος print (Είναι δεύτερο εργαστήριο που δεν καταφέρνετε να εκτυπώσετε σωστά τους χαρακτήρες ""...!). - Σωστή αποδέσµευση µνήµης. Page 15
02180 PASS 02181 FAIL - Καλή στοίχιση του κώδικα. - Καλά ονόµατα µεταβλητών και ο ορισµός σταθερών. - Σωστός ορισµός συναρτήσεων και χρήση του const. - Στη malloc δεν κάνετε δέσµευση για το '\0'. - Σωστός ο έλεγχος για τη malloc. - Σωστός ο τρόπος που διατρέχετε τον πίνακα για την εκτύπωσης. - Σωστή η απελευθέρωση µνήµης. - Σωστές οι συνθήκες για τα 2 loops. - Σωστή η χρήση της sprintf. - Η έξοδος του προγράµµατος είναι σωστή. - Στην sprintf βάζουµε STR_SIZE-1 - Δεν εκτυπώνεται η νέα συµβολοσειρά. - Λάθος µέγεθος στη malloc. Διορθώστε το µόνοι σας. Το sizeof(char) είναι το µέγεθος για µια µεταβλητή τύπου char. Θα έπρεπε να το πολλαπλασιάσετε µε το πλήθος των χαρακτήρων του πίνακα. = το µήκος του πίνακα(δεν µετράει το \0) + 1 ( η θέση για το \0) ). - Στη κλήση της συνάρτησης new_string γραµµή 53 δίνετε ως πρώτο όρισµα το formatstring. Φυσικά είναι λάθος! Έπρεπε να βάλετε changed_string για να δουλέψει. Το formatstring δεν είναι η συµβολοσειρά που διαβάζεται από το πληκτρολόγιο. - Στη free_m δεν υλοποιήσατε επανάληψη για την απελευθέρωση όλης της µνήµης, for(i=0; i<size; i++){ free(str[i]); } Γενικά - Αποδεκτή επιλογή ονοµάτων µεταβλητών και συναρτήσεων. Συνάρτηση επεξεργασίας του string - Δεν χρησιµοποιείτε την παράµετρο const στο string όπως ζητάει η εκφώνιση. - Σωστός εντοπισµός της θέσης του χαρακτήρα και σωστός υπολογισµός του µήκους του string που θα αντιγραφεί. - Δεν κάνετε έλεγχο αποτυχίας της malloc. - H αντιγραφή του string είναι λάθος. Χρησιµοποιείτε strcpy, ενώ θα έπρεπε να χρησιµοποιείτε strncpy. Η αντιγραφή µε strcpy αντιγράφει και πέρα από τα όρια της µνήµης που έχετε δεσµεύσει προηγούµενα. - Σωστά επιστρέφετε NULL σε περίπτωση που δεν βρείτε το string. 02183 FAIL Συνάρτηση εκτύπωσης - Ενώ αποθηκεύετε τις NULL τιµές στον πίνακα κατά την εκτύπωση δεν τσεκάρετε αν η τιµή είναι NULL µε αποτέλεσµα να προκαλείτε segmentation fault. - Δεν εκτυπωνετε διπλά εισαγωγικά πριν και µετά από κάθε συµβολοσειρά. - Δεν υλοποιήθηκε. Main - Σωστή ανάγνωση string και χαρακτήρα. - Σωστή κλήση της συνάρτησης επεξεργασίας της συµβολοσειράς και αποθήκευση της επιστρεφόµενης τιµής της. - Σωστή κλήση της συνάρτησης εκτύπωσης. - Δεν ελέγχετε εάν ο χρήστης δώσει κάτι διαφορετικό από 'y' πράγµα που είναι λάθος. - Δεν ελέγχετε εάν βγαίνετε εκτός των ορίων του πίνακα (i>array_size). - Καλή στοίχιση του κώδικα. - Καλά ονόµατα µεταβλητών και ο ορισµός σταθερών. - Σωστός ορισµός συναρτήσεων αλλά δεν χρησιµοποιήσατε const char για τη συµβολοσειρά που περνάτε σαν όρισµα στη συνάρτηση που δηµιουργεί τα αντίγραφα. - Σωστή χρήση της malloc. - Σωστός ο έλεγχος για τη malloc. 02184 Οριακό PASS - Σωστός ο τρόπος που διατρέχετε τον πίνακα για την εκτύπωσης. - Σωστή η απελευθέρωση µνήµης. - Η συνθήκη για την επανάληψη του βήµατος δεν είναι σωστή µε αποτέλεσµα ο κώδικας να "κολλάει" στο µήνυµα "More (y/n)?". - Σωστή η χρήση της sprintf. - Η έξοδος του προγράµµατος δεν είναι σωστή. Page 16
new_string: - Σωστοί παράµετροι. - Σωστή δέσµευση µνήµης. - Η strncpy δεν τοποθετεί το '\0', οποτε έπρεπε να το βάλετε εσείς. str_print: - Σωστή υλοποίηση και σωστά αποφεύγετε την εκτύπωση NULL θέσεων. 02185 PASS free_str: main: - Σωστή ανάγνωση δεδοµένων και χρήση sprintf. - Σωστή κλήση συναρτήσεων. - Το πρόγραµµα παίρνει καινούριο string για οποιαδήποτε χαρακτήρα εκτός του n. Θα έπρεπε να ξαναζητάει µόνο για y. 02186 PASS - Να έχετε πιο καλά ονόµατα µεταβλητών και σναρτήσεων. - Η υλοποίηση της συνάρτηση επεξεργασίας του string είναι σωστή και έχετε βάλει const στις παραµέτρους της συνάρτησης και συγκεκριµένα στο string που περνάτε σαν όρισµα. - στην malloc που χρησιµοποιήσατε έχετε αφήσει χώρο για το \0. Σωστά βάζετε το \0 στο τέλος. - σωστά επιστρέφετε NULL σε περίπτωση που δεν βρει τον χαρακτήρα - σωστά ελέγχετε αν αποτυγχάνει η malloc. - στον πίνακα απο strings, σε περίπτωση που δεν βρίσκετε κάποιον χαρακτήρα σωστά δεν αφήνετε τη θέση του πίνακα κενή - H συνάρτηση που εκτυπώνει είναι σωστή - H συνάρτηση απελευθέρωσης της µνήµης είναι σωστή. - σωστά χρησιµοποιήσατε το formatstring - η κλήση των συναρτήσεων για την εκτύπωση είναι σωστή - η συνθήκη για έξοδο είναι αυτή σωστή. Page 17
Άσκηση 1 ----------------- Γενικά - Καλή επιλογή ονοµάτων µεταβλητών και συναρτήσεων. Συνάρτηση επεξεργασίας string (new_string) - Σωστός εντοπισµός της θέσης του χαρακτήρα µε χρήση της strchr και σωστός έλεγχος εάν η strchr αποτυγχάνει. - Λάθος υπολογισµός του απαραίτητου µεγέθους δέσµευσης µνήµης. Το σωστό είναι size+1 υπολογίζοντας και τον χαρακτήρα '\0' στο τέλος του string. - Σωστή δέσµευση µνήµης µέσω της malloc και σωστός έλεγχος αποτυχίας της malloc. - Σωστή αντιγραφή µε χρήσης της strncpy. - Παραλείπετε να προσθέσετε τον χαρακτήρα '\0' στον τέλος του string που αντιγράψατε. H strncpy δεν προσθέτει τον χαρακτήρα '\0' στο τέλος. Συνάρτηση εκτύπωσης - Σωστή υλοποίηση µε δεδοµένο ότι δεν αποθηκεύετε την επιστρεφόµενη τιµή NULL στον πίνακα µέσα στη main(). - Σωστή η χρήση διπλού pointer αντί για πίνακα δεικτών ως παράµετρο στη συνάρτηση. - Σωστή υλοποίηση µε δεδοµένο ότι δεν αποθηκεύετε την επιστρεφόµενη τιµή NULL στον πίνακα µέσα στη main(). - Σωστή η χρήση διπλού pointer αντί για πίνακα δεικτών ως παράµετρο στη συνάρτηση. 02187 PASS Main - Σωστή ανάγνωση string και χαρακτήρα µε χρήση του format_string. - Σωστή κλήση της συνάρτησης επεξεργασίας της συµβολοσειράς και αποθήκευση της επιστρεφόµενης τιµής της. - Σωστή αύξηση της µεταβλητής i (µετρητής) υπό συνθήκη. - Σωστή κλήση της συνάρτησης εκτύπωσης. - Σωστά ελέγχετε εάν ο χρήστης δώσει κάτι διαφορετικό από 'y' ή 'n' και ξαναρωτάτε τον χρήστη. - Σωστά ελέγχετε στο while εάν βγαίνει το πρόγραµµα εκτός των ορίων του πίνακα και τερµατίζετε την ανακύκλωση. - Σωστά καλείτε τη συνάρτηση απελευθέρωσης µνήµης πριν τον τερµατισµό του προγράµµατος. Άσκηση 2 ----------------- main() - Σωστά δηµιουργείτε το sruct. - Σωστά ορίζετε τον πίνακα από structs. - Δεσµεύετε µνήµη για κάθε ανακλύκλωση ανεξάρτητα αν αυξήθηκε το i ή όχι. Eάν δεν αυξηθεί το i δεσµεύετε µνήµη δύο ή περισσότερες φορές για την ίδια µεταβλητή χωρίς να απελευθερώνετε την παλιά. - ptr[i]->new=(char*)malloc(str_size*sizeof(char)); Ξαναδεσµεύετε µνήµη που ήδη δεσµεύσατε µέσα στη συνάρτηση new_string(). - ptr[i]->new=new; Η συγκεκριµένη εντολή δεν συνιστά αντιγραφή αλλά ανάθεση pointer. Λειτουργεί γιατί έχετε αναθέσει µνήµη µέσα στη συνάρτηση new_string(). Η malloc της προηγούµενης γραµµής είναι λάθος και δηµιουργεί memory leak στο πρόγραµµα σας. Συνάρτηση εκτύπωσης - Σωστή η χρήση διπλού pointer σε struct αντί για πίνακα δεικτών ως παράµετρο στη συνάρτηση. - Σωστή υλοποίηση µε δεδοµένο ότι δεν αποθηκευετε την επιστρεφόµενη τιµή NULL στον πίνακα µέσα στη main(). - Σωστή η χρήση διπλού pointer σε struct αντί για πίνακα δεικτών ως παράµετρο στη συνάρτηση. Ξαναδείτε τη σειρά της δυναµικής δέσµευσης µνήµης για την 2η Άσκηση. Συνιστάται το αρχικό διάβασµα να µην το κάνετε σε συνδυασµό µε δυναµική δέσµευση µνήµης αλλά στατικά. Εφόσον αποφασίσετε ότι θέλετε αν αποθηκεύσετε το string στον πίνακα τότε προχωρήστε στις απαραίτητες δεσµεύσεις µνήµης. Page 18
02189 FAIL lab12grades Στη main: - Έπρεπε να αρχικοποιήσετε το i=0. - Η printf("enter string:"); έπρεπε να είναι πριν την scanf! Έτσι όπως το έχετε κάνει δεν περιµένει να διαβαστεί νέα συµβολοσειρά και µετά ο χαρακτήρας. - Αφήνουµε ΚΕΝΟ στην scanf (για να µη διαβάσει το enter) γραµµή 52 και 60 ' %c'! - Αν τα προσέχατε αυτά θα εκτελούνταν. 02190 PASS 02191 FAIL 02192 οριακό PASS - Στη malloc έπρεπε να πολλαπλασιάζεται µε length +1, το + 1 είναι για τη θέση του \0. - Την free_array ενώ την υλοποιήσατε σωστά, δεν την καλείτε και την έχετε ως σχόλια. -Σωστή στοίχιση, δεν έχετε καλά ονόµατα παραµέτρων. -Σωστή υλοποίηση της συνάρτησης επεξεργασίας του string αλλά δε δεσµεύετε θέση για το /0 -Δεν ελέγχετε άµα αποτύχει η malloc να επιστρέφει NULL συνάρτηση. -Σωστή συνάρτηση εκτύπωσης και απελευθέρωσης µνήµης -Σωστή κλήση συναρτήσεων. -Σωστή ανάγνωση δεδοµένων και συνθηκών loop. - Το compile του προγράµµατος σας αποτελείται απο warnings! - Το πρόγραµµα σας µε την έκκινηση δίνει segmentation fault! Οφείλεται στο γεγονός ότι το format_string το έχετε δηλωµένο σαν char kai όχι σαν char format_string[format_size] Το πρόγραµµα σας πάσχει και από άλλα προβλήµατα που προκαλούν και παρακάτω segmentation fault ακόµη και αν διορθωθεί το λάθος σας µε το format_string - Η κλήση της printing_function θα έπρεπε να γίνει πριν την εσωτερική do while ώστε να εκτυπωθεί και η 1η φορά εκτέλεσης. - Στην "κοµµένη" συµβολοσειρά εµφανίζεται και ο διαχωριστικός χαρακτήρας. Αυτό συµβαίνει γιατί προσθέσατε +1 (για το '\0') στην strndup. Η strndup, αντιγράφει το πλήθος των χαρακτήρων που παίρνει ως δεύτερο όρισµα και τοποθετεί µόνη της το \0 στο τέλος. - Επίσης, η strndup δεσµεύει τόσο χώρο όσο έχει το str_array, ανεξαρτήτως πόσους χαρακτήρες θα αντιγράψει. Αυτό δε το θέλουµε γιατί δεσµεύουµε άσκοπα µνήµη. spacer: - Το string έπρεπε να το παιρνάτε ως const. - Αρχικά θα έπρεπε να κοιτάτε αν έχει βρεθεί ο χαρακτήρας µε strchr και µετά να κάνετε malloc. - Δε έχετε δεσµεύσει χώρο για το '\0'. - Η strncpy δεν τοποθετεί το '\0', οποτε έπρεπε να το βάλετε εσείς. - Στη strncpy δε χρειάζεται το sizeof(char). 02193 PASS print: - Σωστή υλοποίηση και σωστά αποφεύγετε την εκτύπωση NULL θέσεων. free_func: main: - Σωστή ανάγνωση δεδοµένων και χρήση sprintf. - Σωστή κλήση συναρτήσεων. - Σωστό loop. 02195 FAIL - Σωστά ονόµατα µεταβλητών και συναρτήσεων. -Δεν έχετε πολύ καλά ονόµατα µεταβλητών -Δεν υλοποιείτε σωστά τη συνάρτηση επεξεργασίας του string επίσης η παράµετρος char * έπρεπε να είναι const -Δεν ελέγχετε άµα αποτύχει η malloc να επιστρέφει NULL συνάρτηση. -Στη συνάρτηση εκτύπωσης δεν τυπώνετε τα στοιχεία όπως τα ζητάει η εκφώνηση µέσα σε εισαγωγικά, επίσης δεν κάνετε έλεγχο για να παρακάµψετε τυχόν NULL εισαγωγές. -Δεν υλοποιείτε τη συνάρτηση απελευθέρωσης µνήµης -Δεν καλείτε στο σωστό σηµείο τη συνάρτηση εκτύπωσης -Δεν έχετε σωστές συνθήκες loop Page 19
02197 FAIL 02198 PASS 02201 οριακό PASS 02202 οριακό PASS 02203 PASS lab12grades - Η υλοποίηση της συνάρτηση επεξεργασίας του string είναι σωστή αλλά δεν έχετε βάλει const στις παραµέτρους της συνάρτησης και συγκεκριµένα στο string που περνάτε σαν όρισµα. - στην malloc που χρησιµοποιήσατε, έχετε αφήσει χώρο για το \0 και στο τέλος το προσθέτετε - σωστά επιστρέφετε NULL σε περίπτωση που δεν βρει τον χαρακτήρα - σωστά ελέγχετε αν αποτυγχάνει η malloc. - H συνάρτηση που εκτυπώνει είναι σωστή - H συνάρτηση απελευθέρωσης της µνήµης είναι σωστή. - σωστά χρησιµοποιήσατε το formatstring - δεν έχετε ολοκληρώσει την άσκηση ενώ έχετε φτιάξει τις συναρτήσεις, δεν τις καλείτε πουθενά. - δεν καλείτε σωστά τη συνάρτηση που επιστρέφει το split string - δεν κάνει compile το πρόγραµµα σας - Καλή στοίχιση του κώδικα. - Καλά ονόµατα µεταβλητών και ο ορισµός σταθερών. - Σωστός ορισµός συναρτήσεων και χρήση του const. - Στη malloc δεν κάνετε δέσµευση για το '\0'. - Σωστός ο έλεγχος για τη malloc. - Σωστός ο τρόπος που διατρέχετε τον πίνακα για την εκτύπωσης. - Σωστή η απελευθέρωση µνήµης. - Σωστές οι συνθήκες για τα 2 loops. - Σωστή η χρήση της sprintf. - Η έξοδος του προγράµµατος είναι σωστή. -Σωστή στοίχιση σωστά ονόµατα µεταβλητών εκτός του str1 -Σωστοί παράµετροι και υλοποίηση της συνάρτησης επεξεργασίας του string αλλά δε δεσµεύετε θέση για το /0 -Δεν ελέγχετε άµα αποτύχει η malloc να επιστρέφει NULL συνάρτηση. -Δεν υλοποιείτε σωστά τη συνάρτηση εκτύπωσης. -Σωστή η συνάρτηση απελευθέρωσης µνήµης αλλά δεν την καλείτε στο σωστό σηµείο. -Δεν έχετε σωστές συνθήκες loop - Καλά σχόλια. - Καλά ονόµατα µεταβλητών. - Το µέγεθος 13 για το formatstring θα έπρεπε να είναι σταθερά. - Η scanf δεν διαβάζει τον χαρακτήρα '\n' οπότε ήταν περιττό να προσπαθείτε να τον εξαλείψετε. - Σωστό µέγεθος για την δέσµευση του νέου string. - Σωστή χρήση συναρτήσεων του string.h για την δηµιουργία του νέου string. - Λάθος, για ακέραιο 0 το πρόγραµµά σας ακόµη εκτυπώνει 1 φορά το παλίο string στον καινουργιό. - Λάθος print (Είναι δεύτερο εργαστήριο που δεν καταφέρνετε να εκτυπώσετε σωστά τους χαρακτήρες ""...!). - Σωστή αποδέσµευση µνήµης. - Καλά σχόλια, καλός θα ήταν και ο επιµέρους σχολιασµός των συναρτήσεων. - Καλά ονόµατα µεταβλητών. - Σωστές σταθερές. - Σωστή χρήση scanf. - Σωστό µέγεθος για την δέσµευση του νέου string. - Σωστή χρήση συναρτήσεων του string.h για την δηµιουργία του νέου string. - Σωστή εκτύπωση κενού string, για ακέραιο 0. - Σωστή έξοδος. - Σωστή αποδέσµευση µνήµης. - Καλή δουλειά. Page 20
02204 FAIL 02205 PASS 02208 PASS 02209 PASS lab12grades - Η επέκταση του αρχείου έπρεπε να ήταν.tgz - Στο loop αρχικοποίησης στη main µπερδεύετε δύο τελείως διαφορετικά πράγµατα. Το ARRAY_SIZE δεν έχει καµία σχέση µε το STR_SIZE - Το µέγεθος του format string δεν έχει σχέση µε το STR_SIZE. Στην sprintf έπρεπε να είχατε STR_SIZE αντί για ARRAY_SIZE γιατί αυτό είναι το µέγεθος του string πουτ θα διαβαστεί (word_str). - Αυτό που κάνετε αµέσως µετά µε το \0 σας βγάζει πιθανώς εκτός των ορίων του word_str - Σωστή κλήση της copy. Στην print_array έπρεπε να περνάτε το µέγεθος του πίνακα, όχι τον αριθµό που έδωσε ο χρήστης. - Σωστή υλοποίηση του κοµµατιου µε το y/n - Το i++ έπρεπε να γίνεται αµέσως µετα την εισαγωγή του string στον πίνακα, και πριν την εκτύπωση. - Λάθος µέγεθος στη malloc. Το sizeof(str_size) τι είναι? - Για να λειτουργήσει η strcat σωστά την πρώτη φορά, έπρεπε να έχει \0 στην πρώτη θέση του copied_str - Στην print_array δεν εκτυπώνετε \n, κατά τα άλλα είναι οκ - Σωστή free_array - Καλά σχόλια, καλός θα ήταν και ο επιµέρους σχολιασµός των συναρτήσεων. - Καλά ονόµατα µεταβλητών. - Λάθος, το format για την scanf θα έπρεπε να το είχατε κατασκεύασει δυναµικά µε sprintf. - Σωστή χρήση scanf. - Πολύπλοκη λογική, για την είσοδο συνέχειας ή εξόδου από τον χρήστη. Μπορεί να υλοποιηθεί πολύ πιο απλά. - Λάθος µέγεθος για την δέσµευση του νέου string. Παραλείψατε ένα έξτρα χαρακτήρα για το τέλος του string ('\0'). Το οτι δουλεύει είναι καθαρά θέµα υλοποίησης του linux. - Λάθος χρήση του strcat αφού δεν έχετε εισάγε στην αρχή του νέου string τον χαρακτήρα '\0'. Δεύτερη φορά που σταθήκατε τυχεροί! - Σωστή εκτύπωση κενού string, για ακέραιο 0. - Σωστή έξοδος. - Σωστή αποδέσµευση µνήµης. Γενικά πολύ καλή δουλειά. - Καλή στοίχιση του κώδικα. - Καλά ονόµατα µεταβλητών και ο ορισµός σταθερών. - Σωστός ορισµός συναρτήσεων και χρήση του const. - Σωστή χρήση της malloc. - Σωστός ο έλεγχος για τη malloc. - Σωστός ο τρόπος που διατρέχετε τον πίνακα για την εκτύπωσης αλλά επρεπε να τον εκτυπώνετε κάθε φορά που ο χρήστης έδινε µία νέα συµβολοσειρά. - Σωστή η απελευθέρωση µνήµης. - Σωστές οι συνθήκες για τα 2 loops. - Καλή η χρήση της fgets. - Η έξοδος του προγράµµατος είναι σωστή. eksodos(): - Το όνοµα της συνάρτησης είναι παραπλανητικό. Καλείται όταν τερµατίζει το πρόγραµµα; Ένα καλύτερο όνοµα θα µπορούσε να είναι το 'ektypwsi'. main(): - Κακή στοίχιση στο εµφωλευµένο do-while. - Στην eksodos() η τιµή του counter δηλώνει τη θέση της τελευταίας έγκυρης καταχώρησης (i<=counter), ενώ στη clean_memory() η τιµή του counter δηλώνει το πλήθος των έγκυρων στοιχείων (i<counter). Να προσπαθείτε να φτιάχνετε όσο το δυνατόν συνεπείς διεπαφές µεταξύ των επαναχρησιµοποιούµενων υποµονάδων του προγράµµατός σας. Page 21
02210 FAIL 02211 FAIL lab12grades - Στη return_str : - στη malloc έπρεπε να δεσµεύατε ένα ακόµη byte για το \0 - αν το size είναι 0 η συνάρτηση πρέπει να επιστρέφει το κενό string "" και όχι NULL - δεν κατασκευάζετε το string. - Στη find_valid_strings (η οποία έχει παραπλανητικό όνοµα): - Το *ptr_array δείχνει πάντα στο πρώτο string του πίνακα - Στη free_memoth - Έπρεπε να περνάτε τον πίνακα από pointers, όχι ένα string - Στη main: - Όταν διαβάζουµε string µε scanf πρέπει πάντα να βάζουµε περιορισµό µεγέθους στο format string! - Η θέση ARRAY_SIZE που προσπελάζετε είναι εκτός των ορίων του πίνακα. - Το compile του προγράµµατος σας αποτελείται απο warnings! - Το πρόγραµµα σας µε την έκκινηση δίνει segmentation fault! Οφείλεται στο γεγονός ότι το format_string το έχετε δηλωµένο σαν char kai όχι σαν char format_string[format_size] Το πρόγραµµα σας πάσχει και από άλλα προβλήµατα που προκαλούν και παρακάτω segmentation fault ακόµη και αν διορθωθεί το λάθος σας µε το format_string Γενικά - Αποδεκτή επιλογή ονοµάτων µεταβλητών και συναρτήσεων. 02212 Οριακό PASS 02214 FAIL 02215 οριακό PASS Συνάρτηση επεξεργασίας string - Λάθος µήκος δεσµευµένης µνήµης. Δεν υπολογίζετε το '\0' που χρειάζεται το string σας. - Σε περίπτωση που αποτυγχάνει η strchr επιχειρείτε στη συνέχεια να κάνετε malloc πράγµα που µε µεγάλη πιθανότητα επίσης αποτυγχάνει. Τελικά καταλήγετε µε λάθος µήνυµα προς τον χρήστη. Το ορθό θα ήταν η ενότητα του else if να προηγείται της ενότητας του if. - Σωστή χρήση strncpy. - Η εντολή nstring[ptr_chr-string]='\0'; γράφει εκτός των ορίων της µνήµης που έχετε δεσµεύσει. Συνάρτηση εκτύπωσης - Η συνάρτηση εκτύπωσης αν και ελέγχει για NULL θα έπρεπε να συνεχίζει στην επόµενη ανακύκλωση και όχι να σταµατά µε break. - Δεν εκτυπώνετε διπλά εισαγωγικά πριν και µετά από κάθε συµβολοσειρά. Main - Η αύξηση του µετρητή i στην αρχή του while() είναι λάθος. - Σωστή ανάγνωση string και χαρακτήρα. - Σωστή κλήση της συνάρτησης επεξεργασίας της συµβολοσειράς και αποθήκευση της επιστρεφόµενης τιµής της. Δεν ζητείται να εκτυπώνετε το string που αποθηκεύετε. - Σωστή κλήση της συνάρτησης εκτύπωσης αν και δεν εκτυπώνει ποτέ τίποτε!!! (Γιατί?) - Δεν ελέγχετε εάν ο χρήστης δώσει κάτι διαφορετικό από 'ν' πράγµα που είναι λάθος. - Σωστά ελέγχετε εάν βγαίνετε εκτός των ορίων του πίνακα. - Το όνοµα first_function δεν είναι περιγραφικό - Δεν αφαιρείτε το \n που διαβάζει η fgets, άµεσα. Φαίνεται να το κάνετε στην first_function (που δεν είναι δουλειά της) και χωρίς να ελέγξετε αν όντως υπάρχει. - Λάθος µέγεθος στη malloc. - Η πρώτη θέση ενός πίνακα είναι η 0, όχι η 1 - Αν ο χρήστης δώσει κάτι διαφορετικό του y/n, πρέπει να ξαναζητάτε χαρακτήρα - Λάθος αποδέσµευση µνήµης - Σωστή κλήση συναρτήσεων - Λάθος υλοποίηση print - Η κλήση της printing_function θα έπρεπε να γίνει πριν την εσωτερική do while ώστε να εκτυπωθεί και η 1η φορά εκτέλεσης. - Στην "κοµµένη" συµβολοσειρά εµφανίζεται και ο διαχωριστικός χαρακτήρας. Αυτό συµβαίνει γιατί προσθέσατε +1 (για το '\0') στην strndup. Η strndup, αντιγράφει το πλήθος των χαρακτήρων που παίρνει ως δεύτερο όρισµα και τοποθετεί µόνη της το \0 στο τέλος. - Επίσης, η strndup δεσµεύει τόσο χώρο όσο έχει το str_array, ανεξαρτήτως πόσους χαρακτήρες θα αντιγράψει. Αυτό δε το θέλουµε γιατί δεσµεύουµε άσκοπα µνήµη. Page 22