Δημοσιεύτηκε: 05 Σεπ 2011, 21:53
από migf1
stamatiou έγραψε:Συγνώμη βρε παιδιά, αλλά είχα σταματήσει λίγο να κοιτάζω τις δημοσιεύσεις...

Μπούχτισες ε; :lol:

Σε καταλαβαίνω πάντως, γιατί όντως αρχίζουν να γίνονται βαρετά από ένα σημείο και μετά τα strings. Βασικά υπάγονται κι αυτά στη γενικότερη φιλοσοφία της C, η οποία για να μπορέσει κάποιος να γίνει παραγωγικός πρέπει πρώτα να περάσει ένα βαρετό στάδιο εκμάθησης του παρασκηνίου. Όταν το μάθει όμως, μετά θα... πετάει :)

Και ειδικά με τα strings, αν μάθετε το παρασκήνιό τους θα έχετε κάνει ένα πολύ μεγάλο κι ουσιαστικό βήμα στην εκμάθηση της γλώσσας γενικότερα!

Θέλω να μιλήσουμε λίγο και για τους έξτρα ελέγχους που χρειάζονται και μετά έχω σκοπό (αν το θέλετε κι εσείς) να χρησιμοποιήσουμε όσα έχουμε πει για να φτιάξουμε μια δική μας μικρή βιβλιοθήκη από συναρτήσεις διαχείρισης strings, οι οποίες θα είναι πιο ασφαλείς από τις αντίστοιχες στάνταρ συναρτήσεις, συχνά ταχύτερες και ελπίζω πιο εύκολες στην χρησιμοποίησή τους.

Για να πάρετε μια γεύση του τι εννοώ, φανταστείτε για παράδειγμα διαχείριση strings όπου δεν θα χρειάζεται να ασχολείστε με το αν θα γίνει buffer overflow (ή buffer underflow), δεν θα χρειάζεται να θυμάστε αν πρέπει ή δεν πρέπει να χρησιμοποιείτε & μπροστά από τα strings όταν τα περνάτε ως ορίσματα στις συναρτήσεις (θα τα περνάμε όλα χωρίς &) δεν θα χρειάζεται να ασχολείστε με το ποιο είναι το τρέχον και ποιο το μέγιστο μήκος του κάθε strings και μερικά ακόμα.

Φανταστείτε για παράδειγμα κώδικα σαν τον παρακάτω:
Κώδικας: Επιλογή όλων

#include "mystring.h"
// ----------------------------------------------------------------------------------------------------
int main( void )
{
String *s1 = string_new("this is a string);
String *s2 = string_new(" and this is another string");

string_puts( s1 ); // τυπώνει: this is a string
string_append(s1, s2); // κολλάει το s2 στο τέλος του s1, μεγαλώνοντας αυτόματα το μήκος του s1
string_puts( s1 ); // τυπώνει: this is a string and this is another string

string_text_change(s1, "abcd"); // αλλάζει το κείμενο του s1 σε "abcd", ενημερώνοντας αυτόματα το μήκος
string_puts( s1 ); // τυπώνει: abcd

string_swap( s1, s2 ); // εναλλάσσει τα κείμενα μεταξύ των s1 και s2, ενημερώνοντας τα μήκη τους

printf( "s1 = %s, s2 = %s\n", // τυπώνει: s1 = and this is another string, s2 = abcd
string_text( s1 ),
string_text( s2 )
);

string_reverse( s2 ); // αντιστρέφει το κείμενο του s2
string_puts( s2 ); // τυπώνει: dcba

string_copy(s1, string_reverse( s2 ) ); // αντιστρέφει το s2 και το αντιγράφει στο s1

printf( "s1 = %s, s2 = %s\n", // τυπώνει: s1 = abcd, s2 = abcd
string_text( s1 ),
string_text( s2 )
);

string_destroy( s1 ); // αποδεσμεύει τη μνήμη του s1
string_destroy( s2 ); // αποδεσμεύει τη μνήμη του s2

return 0;
}

είναι σαν να γράφεις σε άλλη γλώσσα, σε μια πιο εύκολη C :) Και μάλιστα, αν το κάνουμε compile με την επιλογή -std=c99 στη γραμμή εντολών του gcc (που ενεργοποιεί τα στάνταρ που θεσπίστηκαν με την αναθεώρηση C99) τότε δεν χρειάζεται καν να κάνουμε string_destroy() στο τέλος του προγράμματος, διότι η αναθεώρηση C99 υποχρεώνει τους compilers να απελευθερώνουν αυτόματα ότι μνήμη έχουμε δεσμεύσει δυναμικά (και να κλείνουν τυχόν αρχεία που έχουμε ανοίξει) πριν τερματιστεί το πρόγραμμά μας :)

Προφανώς δεν θα φτιάξουμε συναρτήσεις που θα αντικαθιστούν όλες τις στάνταρ συναρτήσεις διαχείρισης strings. Θα φτιάξουμε μερικές (αν το θέλετε) θα σας δώσω κι εγώ μερικές έτοιμες και μετά μπορούμε να δούμε πως μπορούμε να τις κάνουμε compile ως βιβλιοθήκη, την οποία μπορούμε κατόπιν να τη χρησιμοποιούμε προαιρετικά σε οποιοδήποτε άλλο πρόγραμμα φτιάξουμε :)

Πως σας φαίνεται κάτι τέτοιο; Θα έχει ενδιαφέρον;

έγραψε: και δεν κατάλαβα κάτι, όταν υπερχειλίζει το buffer δλδ πού πάει το υπόλοιπο κείμενο και αποτελεί πρόβλημα ασφάλειας;

Πάει και αντικαθιστά δεδομένα άλλων μεταβλητών του προγραμματός μας ή άλλων δεδομένων.