Άρθρο #9: Συμβολοσειρές

Επισκόπηση προηγούμενης Θ.Ενότητας Επισκόπηση επόμενης Θ.Ενότητας Πήγαινε κάτω

Άρθρο #9: Συμβολοσειρές

Δημοσίευση από GReaper Την / Το Παρ Σεπ 07, 2012 3:21 pm

Μια συμβολοσειρά/αλφαριθμητικό δεν είναι τίποτα παραπάνω από πίνακας χαρακτήρων, ο οποίος συμβολίζει το τερματισμό του με τον χαρακτήρα '\0' και έτσι μπορεί να χρησιμοποιηθεί χωρίς να χρειάζεται το μέγεθός του.

Ένα στατικό αλφαριθμητικό έχει αυτόν το χαρακτήρα στο τέλος τους. Οι παρακάτω τρόποι ανάθεσης είναι πανομοιότυποι:
Κώδικας:
char myName[] = "GReaper";
char myName[] = { 'G', 'R', 'e', 'a', 'p', 'e', 'r', '\0' };

Όμως οι δύο παρακάτω τρόποι ΔΕΝ είναι ίδιοι:
Κώδικας:
char myName[] = "GReaper";
char *myName = "GReaper";
ο πρώτος αντιγράφει το στατικό αλφαριθμητικό "GReaper" σε έναν νέο πίνακα με το ίδιο μέγεθος, ενώ ο δεύτερος απλά θέτει τον δείκτη προς τη θέση μνήμης στην οποία είναι αυτό το στατικό αλφαριθμητικό. Επίσης, στη δεύτερη περίπτωση, είναι πολύ πιθανό ο μεταγλωττιστής σας να διαμαρτυρηθεί, κι αυτό επειδή αυτά τα στατικά αλφαριθμητικά είναι "μόνο για ανάγνωση", και είναι επίσης πιθανόν να είναι αποθηκευμένα σε μνήμη "μόνο για ανάγνωση", οπότε η προσπάθεια να αλλάξετε τα περιεχόμενά τους θα καταρρεύσει το πρόγραμμα.
Έτσι, για να σταματήσει να μας ζαλίζει ο μεταγλωττιστής και για να προστατέψουμε το πρόγραμμά μας από πιθανά λάθη, χρησιμοποιούμε μια ειδική λέξη, την "const", η οποία μπορεί να μπει μπροστά από οποιοδήποτε τύπο κατά τη δήλωση και κυριολεκτικά απαγορεύει στον προγραμματιστή θα αλλάξει τη τιμή της, όχι πια μεταβλητής, αλλά σταθεράς.
Έτσι, για να έχουμε το κεφάλι μας ήσυχο, την παραπάνω δεύτερη περίπτωση, αν είναι τόσο απαραίτητο να χρησιμοποιήσουμε απλό δείκτη αντί για τοπικό πίνακα, το δηλώνουμε έτσι:
Κώδικας:
const char *myName = "GReaper";
τώρα τίποτα δεν πρόκειται να αλλάξει τη συμβολοσειρά μας, όχι κατά λάθος τουλάχιστον.

Βεβαίως υπάρχουν και τρόποι να αλλάξετε τα περιεχόμενά τους, είτε με δικό σας κώδικα ή χρησιμοποιώντας τις συναρτήσεις που παρέχει η C. Μερικές αναφέρονται παρακάτω. Να σημειωθεί ότι πρέπει να συμπεριλάβετε το αρχείο κεφαλίδα "string.h", το οποίο περιέχει αυτές αλλά και πολλές άλλες συναρτήσεις.

Χωρίς προστασία υπερχείλισης:
strcpy(dst, src) : Αντιγράφει το αλφαριθμητικό "src" στο "dst"

strcmp(str1, str2) : Συγκρίνει τα "str1" και "str2". Επιστρέφει 0 αν είναι ίσα, <0 αν το πρώτο είναι μικρότερο του δευτέρου και >0 για το αντίθετο

strcat(dst, src) : "Προσθέτει" το "src" στο τέλος του "dst"

Με προστασία υπερχείλισης:
strncpy(dst, src, n) : Αντιγράφει το πολύ "n" χαρακτήρες απ`το αλφαριθμητικό "src" στο "dst" ( Μαζί με τον τερματικό χαρακτήρα! )

strncmp(str1, str2, n) : Συγκρίνει τα "str1" και "str2" μέχρι "n" χαρακτήρες. Επιστρέφει 0 αν είναι ίσα, <0 αν το πρώτο είναι μικρότερο του δευτέρου και >0 για το αντίθετο

strncat(dst, src, n) : "Προσθέτει" το πολύ "n" χαρακτήρες απ`το "src" στο τέλος του "dst"

Αυτά είναι τα βασικά που πρέπει να γνωρίζετε για τα "strings". Προσπαθήστε να φτιάξετε ένα πρόγραμμα που να χρησιμοποιεί αυτές τις ιδιότητες των συμβολοσειρών και/ή τις συναρτήσεις της γλώσσας. Μπορείτε να φτιάξετε τις δικές σας τώρα που γνωρίζετε πώς λειτουργούν οι πίνακες/δείκτες, τα αλφαριθμητικά, οι δομές επανάληψης και οι συναρτήσεις.

Happy Coding :-)
avatar
GReaper
Admin

Αριθμός μηνυμάτων : 16
Ημερομηνία εγγραφής : 01/10/2011
Ηλικία : 25
Τόπος : Σπάρτη

http://procorn.forumgreek.com

Επιστροφή στην κορυφή Πήγαινε κάτω

Επισκόπηση προηγούμενης Θ.Ενότητας Επισκόπηση επόμενης Θ.Ενότητας Επιστροφή στην κορυφή


 
Δικαιώματα σας στην κατηγορία αυτή
Δεν μπορείτε να απαντήσετε στα Θέματα αυτής της Δ.Συζήτησης