Κεφάλαιο 13: Αλφαριθμητικά στη C

Βοηθητικό μάθημα — βιβλιοθήκες για επεξεργασία strings και χαρακτήρων

13.1 Οι βιβλιοθήκες string.h και ctype.h

Για να δουλέψουμε με αλφαριθμητικά (strings) και χαρακτήρες στη C, χρειαζόμαστε δύο βασικές βιβλιοθήκες της standard library:

#include <string.h> // Βιβλιοθήκη για strcmp, strcspn #include <ctype.h> // Βιβλιοθήκη για islower, isupper, toupper, tolower

📦 <string.h>

Η string.h είναι η βιβλιοθήκη της C που περιέχει συναρτήσεις για επεξεργασία αλφαριθμητικών (strings). Από αυτή θα χρησιμοποιήσουμε δύο συναρτήσεις:

🔹 strcmp — Σύγκριση δύο αλφαριθμητικών

Η strcmp(s1, s2) συγκρίνει χαρακτήρα-χαρακτήρα δύο αλφαριθμητικά και επιστρέφει:

⚠️ Προσοχή: Δεν συγκρίνουμε strings με ==! Το str1 == str2 δεν συγκρίνει τα περιεχόμενα, αλλά τις διευθύνσεις των πινάκων.

Παράδειγμα:

#include <stdio.h> #include <string.h> int main() { char s1[] = "hello"; char s2[] = "hello"; if (strcmp(s1, s2) == 0) printf("Τα strings είναι ίδια\n"); else printf("Τα strings είναι διαφορετικά\n"); return 0; }
Τα strings είναι ίδια

🔹 strcspn — Εύρεση θέσης χαρακτήρα

Η strcspn(s, set) ψάχνει μέσα στο αλφαριθμητικό s και επιστρέφει τη θέση του πρώτου χαρακτήρα που ταιριάζει με κάποιον χαρακτήρα από το σύνολο set.

Παράδειγμα — εύρεση πρώτου φωνήεντος:

#include <stdio.h> #include <string.h> int main() { char str[] = "hello world"; int pos = strcspn(str, "aeiou"); // ψάχνει το πρώτο φωνήεν printf("Πρώτο φωνήεν στη θέση: %d\n", pos); return 0; }
Πρώτο φωνήεν στη θέση: 1

📌 Σχηματικά

str: h e l l o w o r l d index: 0 1 2 3 4 5 6 7 8 9 10 το πρώτο φωνήεν ('e') βρίσκεται στη θέση 1 → strcspn επιστρέφει 1

Η συνάρτηση διατρέχει το str από την αρχή και σταματάει μόλις βρει χαρακτήρα που υπάρχει στο σύνολο "aeiou". Επιστρέφει το πλήθος των χαρακτήρων πριν από αυτόν — δηλαδή τη θέση του.

🔄 Διαφορά με την strspn

Υπάρχει και η «αδελφή» συνάρτηση strspn που κάνει ακριβώς το αντίθετο. Το γράμμα "c" στο strcspn σημαίνει complement (συμπλήρωμα).

ΣυνάρτησηΤι μετράει
strspn(s, set)πόσοι χαρακτήρες στην αρχή του s ανήκουν στο σύνολο set
strcspn(s, set)πόσοι χαρακτήρες στην αρχή του s ΔΕΝ ανήκουν στο σύνολο set

Παράδειγμα σύγκρισης με την ίδια είσοδο:

strcspn("hello world", "aeiou") 1 // θέση πρώτου φωνήεντος strspn ("hello world", "aeiou") 0 // κανένα φωνήεν στην αρχή

📌 Σχηματικά για την strspn:

str: h e l l o w o r l d index: 0 1 2 3 4 5 6 7 8 9 10 το 'h' ΔΕΝ είναι φωνήεν (δεν ανήκει στο "aeiou") → strspn επιστρέφει 0 (κανένα φωνήεν στην αρχή)

Με την ίδια ακριβώς είσοδο, η strspn σταματάει αμέσως στον πρώτο χαρακτήρα ('h') επειδή δεν ανήκει στο σύνολο. Επιστρέφει 0. Αντίθετα η strcspn προχώρησε ένα βήμα και σταμάτησε στο 'e' (που ανήκει στο σύνολο), επιστρέφοντας 1.

Η πιο συχνή χρήση της strcspn στην πράξη είναι η αφαίρεση του '\n' που αφήνει η fgets στο τέλος του string όταν ο χρήστης πατάει Enter.

Παράδειγμα:

#include <stdio.h> #include <string.h> int main() { char str[] = "Hello\n"; // Βρίσκει τη θέση του '\n' και τη γεμίζει με '\0' str[strcspn(str, "\n")] = '\0'; printf("[%s]\n", str); return 0; }
[Hello]

📦 <ctype.h>

Η ctype.h είναι η βιβλιοθήκη της C που περιέχει συναρτήσεις για έλεγχο και μετατροπή χαρακτήρων. Από αυτή θα χρησιμοποιήσουμε τέσσερις συναρτήσεις:

🔹 islower — Είναι πεζό γράμμα;

Η islower(c) επιστρέφει μη μηδενική τιμή (αληθές) αν ο χαρακτήρας c είναι πεζό γράμμα ('a' έως 'z'), αλλιώς επιστρέφει 0 (ψευδές).

#include <stdio.h> #include <ctype.h> int main() { char c = 'a'; if (islower(c)) printf("Το %c είναι πεζό\n", c); else printf("Το %c δεν είναι πεζό\n", c); return 0; }
Το a είναι πεζό

🔹 isupper — Είναι κεφαλαίο γράμμα;

Η isupper(c) επιστρέφει μη μηδενική τιμή (αληθές) αν ο χαρακτήρας c είναι κεφαλαίο γράμμα ('A' έως 'Z'), αλλιώς επιστρέφει 0 (ψευδές).

#include <stdio.h> #include <ctype.h> int main() { char c = 'A'; if (isupper(c)) printf("Το %c είναι κεφαλαίο\n", c); else printf("Το %c δεν είναι κεφαλαίο\n", c); return 0; }
Το A είναι κεφαλαίο

🔹 toupper — Μετατροπή σε κεφαλαίο

Η toupper(c) δέχεται έναν χαρακτήρα και επιστρέφει το αντίστοιχο κεφαλαίο. Αν ο χαρακτήρας δεν είναι πεζό γράμμα, τον επιστρέφει όπως είναι.

#include <stdio.h> #include <ctype.h> int main() { char c = 'a'; char up = toupper(c); printf("%c -> %c\n", c, up); return 0; }
a -> A

🔹 tolower — Μετατροπή σε πεζό

Η tolower(c) δέχεται έναν χαρακτήρα και επιστρέφει το αντίστοιχο πεζό. Αν ο χαρακτήρας δεν είναι κεφαλαίο γράμμα, τον επιστρέφει όπως είναι.

#include <stdio.h> #include <ctype.h> int main() { char c = 'A'; char low = tolower(c); printf("%c -> %c\n", c, low); return 0; }
A -> a

13.2 Μετατροπή ολόκληρου αλφαριθμητικού

Οι συναρτήσεις toupper και tolower δουλεύουν με έναν χαρακτήρα κάθε φορά. Δεν υπάρχει έτοιμη συνάρτηση στη standard library που να μετατρέπει ένα ολόκληρο αλφαριθμητικό. Όμως, αφού ένα string στη C είναι απλώς ένας πίνακας χαρακτήρων που τελειώνει με '\0', μπορούμε να το διατρέξουμε με ένα for και να μετατρέψουμε κάθε χαρακτήρα ξεχωριστά.

🔹 Μετατροπή σε ΚΕΦΑΛΑΙΑ

Διατρέχουμε το string μέχρι να βρούμε τον τερματικό χαρακτήρα '\0', και αντικαθιστούμε κάθε θέση με το κεφαλαίο της:

#include <stdio.h> #include <ctype.h> int main() { char str[] = "hello world"; int i; for (i = 0; str[i] != '\0'; i++) { str[i] = toupper(str[i]); } printf("%s\n", str); return 0; }
HELLO WORLD

🔹 Μετατροπή σε πεζά

Ακριβώς το ίδιο σκεπτικό, αλλά καλούμε tolower:

#include <stdio.h> #include <ctype.h> int main() { char str[] = "HELLO WORLD"; int i; for (i = 0; str[i] != '\0'; i++) { str[i] = tolower(str[i]); } printf("%s\n", str); return 0; }
hello world

📌 Πώς λειτουργεί ο βρόχος

  • Ο i ξεκινάει από 0 (πρώτος χαρακτήρας).
  • Συνεχίζει όσο το str[i] δεν είναι ο τερματικός χαρακτήρας '\0'.
  • Σε κάθε επανάληψη, αντικαθιστούμε τον χαρακτήρα στη θέση i με τον μετατραπείσα έκδοσή του.
  • Οι χαρακτήρες που δεν είναι γράμματα (κενά, σημεία στίξης, αριθμοί) μένουν ίδιοι — η toupper/tolower δεν τους πειράζει.

📌 Σημείωση

Όπως κάθε βιβλιοθήκη της standard library, τις συμπεριλαμβάνουμε με την οδηγία #include στην αρχή του προγράμματος. Χωρίς αυτές τις γραμμές, ο compiler δεν θα αναγνωρίζει τις παραπάνω συναρτήσεις και θα μας δώσει σφάλμα.