Συμβολοσειρά (string) είναι μιά σειρά αλφαριθμητικών χαρακτήρων (γενικά
εκτυπώσιμων συμβόλων ASCII). Όταν λέμε σειρά εννοούμε διαδοχικές θέσεις
μνήμης που μπορούν να αντιμετωπισθούν σαν ένα σύνολο διατεταγμένων
στοιχειωδών δεδομένων. Η αναγκαιότητα των συμβολοσειρών πρέπει να έχει
γίνει ήδη κατανοητή αφού έχουν άτυπα χρησιμοποιηθεί σε πολλά προγράμματα.
Πρόκειται γιά τα μηνύματα που συνοδεύουν τις εκτυπώσεις με τη συνάρτηση
printf.
Στη C η συμβολοσειρά ορίζεται σαν μιά σειρά δεδομένων του τύπου char τα
οποία τερματίζονται με έναν μηδενικό χαρακτήρα (NULL). Όταν η C χειρίζεται τη
συμβολοσειρά με κάποιο τρόπο, π.χ. να τη συγκρίνει με κάποια άλλη
συμβολοσειρά, να την εκτυπώσει, να την αντιγράψει σε μιά άλλη συμβολοσειρά,
κ.λ.π., οι συναρτήσεις που καλούνται είναι σχεδιασμένες να εκτελούν τη
λειτουργία τους μέχρι να συνατήσουν τον μηδενικό χαρακτήρα.
Πίνακας είναι μιά σειρά από δεδομένα του αυτού τύπου, ο οποίος όμως τύπος
δεν είναι απαραίτητα στοιχειώδης (π.χ. ακέραιος, πραγματικός, κ.λ.π). Η
συμβολοσειρά είναι ένας ειδικός τύπος πίνακα με δεδομένα του τύπου char και
με τερματισμό μέσω του μηδενικού χαρακτήρα.
Το πρόγραμμα του αρχείου CHRSTRG.C δίνει παραδείγματα γιά τους παραπάνω
ορισμούς.
Το πρώτο που πρέπει να προσέξουμε είναι η δήλωση της συμβολοσειράς ως
πίνακα χαρακτήρων. Η δήλωση μοιάζει με τη δήλωση μεταβλητής χαρακτήρα
αλλά μετά το όνομα της μεταβλητής, και χωρίς κενό, ακολουθεί ένα ζεύγος
τεράγωνων παρενθέσεων που περιέχει έναν αριθμό ο οποίος καθορίζει το
μέγεθος του πίνακα, δηλαδή τον αριθμό των στοιχειωδών δεδομένων που
περιέχει ο πίνακας. Στη περίπτωσή μας η συμβολοσειρά μπορεί να έχει το πολύ 5
χαρακτήρες. Η δήλωση μεγέθους είναι απαραίτητη γιά να δεσμεύσει ο
μεταφραστής 5 συνεχόμενες θέσεις μνήμης, όπου η κάθε μία έχει χωρητικότητα
ενός χαρακτήρα. Οι θέσεις αυτές έχουν η κάθε μία το δικό της όνομα που
καθορίζεται ως συνδυασμός δύο τμημάτων: της βάσης (base) και της απόστασης
(offset). Η βάση (το βασικό όνομα) είναι το όνομα του πίνακα, δηλαδή name, και
η απόσταση είναι ο αριθμός σειράς του στοιχείου. Στην C ο αριθμός σειράς
ξεκινά από το 0 και φθάνει μέχρι το μέγεθος του πίνακα μείον μία θέση. Έτσι
έχουμε τις μεταβλητές name[0], name[1], name[2], name[3], και name[4].
Γιά τον μεταφραστή και το σύστημα εκτέλεσης του προγράμματος τα ονόματα
αυτά σημαίνουν ακριβώς
|
Επιστρέφοντας στο πρόγραμμα διαπιστώνουμε οτι ο πίνακας χαρακτήρων name
έχει 5 θέσεις. Γιά να τον χρησιμοποιήσουμε όμως ως συμβολοσειρά πρέπει ο
τελευταίος χαρακτήρας να είναι ο μηδενικός, άρα μένουν τέσσερις ωφέλιμες
θέσεις χαρακτήρων. Στη συνέχεια του προγράμματος με τη βοήθεια 5
εκχωρήσεων χαρακτήρων θέτουμε τιμές στα στοιχεία του πίνακα. Ιδιαίτερη
σημασία έχει η τελευταία εκχώρηση που δείχνει οτι ο μηδενικός χαρακτήρας
είναι το αριθμητικό μηδέν, όχι ο χαρακτήρας μηδέν. Μερικές φορές θα το
συνατήσετε και ως '\0'.
Η εκτύπωση μιάς σταθερής συμβολοσειράς γίνεται με τη βοήθεια της συνάρτησης
printf όπως έχουμε ήδη δεί από τα πρώτα μαθήματα. Απλά η συμβολοσειρά -
μήνυμα περικλείεται από διπλά εισαγωγικά, π.χ.
printf("This is a constant string");
Στη περίπτωση του πίνακα name έχουμε μιά μεταβλητή συμβολοσειρά και η
εμφάνισή της γίνεται με τον χαρακτήρα ελέγχου '%s', όπως φαίνεται στη πρώτη
πρόταση εκτύπωσης του προγράμματος. Σημειώστε ακόμη οτι μόνο το όνομα του
πίνακα δίνεται, χωρίς την ένδειξη των τετράγωνων παρενθέσεων. Αυτό σημαίνει
οτι στην εκτύπωση της συμβολοσειράς χρησιμοποιείται μόνο η διεύθυνση της
βάσης, δηλαδή του ονόματος name. Ο μηδενικός χαρακτήρας δεν εκτυπώνεται
αλλά χρησιμοποιείται από την printf γιά το έλεγχο τερματισμού της
συμβολοσειράς.
Η δεύτερη πρόταση δείχνει οτι και ο κάθε χαρακτήρας που είναι στοιχείο της
συμβολοσειράς μπορεί να εκτυπωθεί αυτόνομα με τη χρήση του χαρακτήρα
ελέγχου '%c' και του ονόματος του συγκεκριμένου χαρακτήρα, π.χ. name[2]. Θα
μπορούσαμε να εκφράσουμε τη λειτουργία εκτύπωσης ολόκληρης της
συμβολοσειράς με τη βοήθεια μιάς επενάληψης for ως
for(index = 0; name[index]; index++)
printf("%c",name[index]);
Σημειώστε οτι ο μηδενικός χαρακτήρας ισοδυναμεί με το αριθμητικό 0, δηαδή τη
λογική τιμή του ψευδούς άρα καθιστά τη συνθήκη ελέγχου ψευδή και τερματίζει
την επενάληψη.
Η τελευταία πρόταση εκτύπωσης παρουσιάζει τη δυνατότητα να εκτυπώσουμε
μιά συμβολοσειρά όχι από την αρχή αλλά από καποιο σημείο και μετά. Όπως
είδαμε η εκτύπωσης της συμβολοσειράς απαιτεί μόνο μιά διεύθυνση, την
διεύθυνση εκκίνησης της εκτύπωσης. Όταν εκτυπώνουμε το σύνολο της
συμβολοσειράς η διεύθυνση εκκίνησης συμπίπτει με τη διέυθυνση της βάσης,
δηλαδή το όνομα name. 'Οταν όμως; θέλουμε να ξεκινήσουμε από τον πρώτο, ας
πόυμε, χαρακτήρα, πρέπει να ορίσουμε τη δική του διεύθυνση ως διεύθυνση
εκκίνησης. Επεκτείνοντας τον πίνακα της προηγούμενης παραγράφου έχουμε
|