📚 Περιεχόμενα Κεφαλαίου
13.1 Οι βιβλιοθήκες string.h και ctype.h
Για να δουλέψουμε με αλφαριθμητικά (strings) και χαρακτήρες στη C, χρειαζόμαστε δύο βασικές βιβλιοθήκες της standard library:
📦 <string.h>
Η string.h είναι η βιβλιοθήκη της C που περιέχει συναρτήσεις για επεξεργασία αλφαριθμητικών (strings). Από αυτή θα χρησιμοποιήσουμε δύο συναρτήσεις:
🔹 strcmp — Σύγκριση δύο αλφαριθμητικών
Η strcmp(s1, s2) συγκρίνει χαρακτήρα-χαρακτήρα δύο αλφαριθμητικά και επιστρέφει:
- 0 αν τα δύο strings είναι ίδια
- κάποια μη μηδενική τιμή αν είναι διαφορετικά
Παράδειγμα:
🔹 strcspn — Εύρεση θέσης χαρακτήρα
Η strcspn(s, set) ψάχνει μέσα στο αλφαριθμητικό s και επιστρέφει τη θέση του πρώτου χαρακτήρα που ταιριάζει με κάποιον χαρακτήρα από το σύνολο set.
Παράδειγμα — εύρεση πρώτου φωνήεντος:
📌 Σχηματικά
Η συνάρτηση διατρέχει το str από την αρχή και σταματάει μόλις βρει χαρακτήρα που υπάρχει στο σύνολο "aeiou". Επιστρέφει το πλήθος των χαρακτήρων πριν από αυτόν — δηλαδή τη θέση του.
🔄 Διαφορά με την strspn
Υπάρχει και η «αδελφή» συνάρτηση strspn που κάνει ακριβώς το αντίθετο. Το γράμμα "c" στο strcspn σημαίνει complement (συμπλήρωμα).
| Συνάρτηση | Τι μετράει |
|---|---|
| strspn(s, set) | πόσοι χαρακτήρες στην αρχή του s ανήκουν στο σύνολο set |
| strcspn(s, set) | πόσοι χαρακτήρες στην αρχή του s ΔΕΝ ανήκουν στο σύνολο set |
Παράδειγμα σύγκρισης με την ίδια είσοδο:
📌 Σχηματικά για την strspn:
Με την ίδια ακριβώς είσοδο, η strspn σταματάει αμέσως στον πρώτο χαρακτήρα ('h') επειδή δεν ανήκει στο σύνολο. Επιστρέφει 0. Αντίθετα η strcspn προχώρησε ένα βήμα και σταμάτησε στο 'e' (που ανήκει στο σύνολο), επιστρέφοντας 1.
Η πιο συχνή χρήση της strcspn στην πράξη είναι η αφαίρεση του '\n' που αφήνει η fgets στο τέλος του string όταν ο χρήστης πατάει Enter.
Παράδειγμα:
📦 <ctype.h>
Η ctype.h είναι η βιβλιοθήκη της C που περιέχει συναρτήσεις για έλεγχο και μετατροπή χαρακτήρων. Από αυτή θα χρησιμοποιήσουμε τέσσερις συναρτήσεις:
🔹 islower — Είναι πεζό γράμμα;
Η islower(c) επιστρέφει μη μηδενική τιμή (αληθές) αν ο χαρακτήρας c είναι πεζό γράμμα ('a' έως 'z'), αλλιώς επιστρέφει 0 (ψευδές).
🔹 isupper — Είναι κεφαλαίο γράμμα;
Η isupper(c) επιστρέφει μη μηδενική τιμή (αληθές) αν ο χαρακτήρας c είναι κεφαλαίο γράμμα ('A' έως 'Z'), αλλιώς επιστρέφει 0 (ψευδές).
🔹 toupper — Μετατροπή σε κεφαλαίο
Η toupper(c) δέχεται έναν χαρακτήρα και επιστρέφει το αντίστοιχο κεφαλαίο. Αν ο χαρακτήρας δεν είναι πεζό γράμμα, τον επιστρέφει όπως είναι.
🔹 tolower — Μετατροπή σε πεζό
Η tolower(c) δέχεται έναν χαρακτήρα και επιστρέφει το αντίστοιχο πεζό. Αν ο χαρακτήρας δεν είναι κεφαλαίο γράμμα, τον επιστρέφει όπως είναι.
13.2 Μετατροπή ολόκληρου αλφαριθμητικού
Οι συναρτήσεις toupper και tolower δουλεύουν με έναν χαρακτήρα κάθε φορά. Δεν υπάρχει έτοιμη συνάρτηση στη standard library που να μετατρέπει ένα ολόκληρο αλφαριθμητικό. Όμως, αφού ένα string στη C είναι απλώς ένας πίνακας χαρακτήρων που τελειώνει με '\0', μπορούμε να το διατρέξουμε με ένα for και να μετατρέψουμε κάθε χαρακτήρα ξεχωριστά.
🔹 Μετατροπή σε ΚΕΦΑΛΑΙΑ
Διατρέχουμε το string μέχρι να βρούμε τον τερματικό χαρακτήρα '\0', και αντικαθιστούμε κάθε θέση με το κεφαλαίο της:
🔹 Μετατροπή σε πεζά
Ακριβώς το ίδιο σκεπτικό, αλλά καλούμε tolower:
📌 Πώς λειτουργεί ο βρόχος
- Ο i ξεκινάει από 0 (πρώτος χαρακτήρας).
- Συνεχίζει όσο το str[i] δεν είναι ο τερματικός χαρακτήρας '\0'.
- Σε κάθε επανάληψη, αντικαθιστούμε τον χαρακτήρα στη θέση i με τον μετατραπείσα έκδοσή του.
- Οι χαρακτήρες που δεν είναι γράμματα (κενά, σημεία στίξης, αριθμοί) μένουν ίδιοι — η toupper/tolower δεν τους πειράζει.
📌 Σημείωση
Όπως κάθε βιβλιοθήκη της standard library, τις συμπεριλαμβάνουμε με την οδηγία #include στην αρχή του προγράμματος. Χωρίς αυτές τις γραμμές, ο compiler δεν θα αναγνωρίζει τις παραπάνω συναρτήσεις και θα μας δώσει σφάλμα.