Συμβολοσειρές στη C
Οι συμβολοσειρές χρησιμοποιούνται για την αποθήκευση κειμένου / χαρακτήρων.
Για παράδειγμα, “Γειά σου Κόσμε” είναι μια συμβολοσειρά χαρακτήρων.
Σε αντίθεση με πολλές άλλες γλώσσες προγραμματισμού, η C δεν έχει έναν τύπο String για τη δημιουργία εύκολων μεταβλητών συμβολοσειρών. Αντ ‘αυτού, πρέπει να χρησιμοποιήσετε τον τύπο char και να δημιουργήσετε έναν πίνακα χαρακτήρων για να δημιουργήσετε μια συμβολοσειρά στη C:
char myString[12] = "Hello World";
Στο παραπάνω παράδειγμα, δημιουργείται ένας πίνακας χαρακτήρων με το όνομα myString και μεγέθους 12. Η αρχική τιμή του πίνακα είναι “Hello World”.
Να σημειωθεί ότι πρέπει να χρησιμοποιήσετε διπλά εισαγωγικά (“”).
Για να εξαγάγετε τη συμβολοσειρά, μπορείτε να χρησιμοποιήσετε τη συνάρτηση printf () μαζί με τον καθοριστή μορφής% s για να ενημερώσετε τη C ότι τώρα εργαζόμαστε με συμβολοσειρές:
char myString[12] = "Hello World"; printf("My string is: %s", myString);
Στο παραπάνω παράδειγμα, χρησιμοποιείται η συνάρτηση printf () για να εμφανίσει τη συμβολοσειρά myString στην οθόνη. Ο καθοριστής μορφής% s χρησιμοποιείται για να πείτε στη C ότι αντί για έναν αριθμό, θα εμφανίσετε μια συμβολοσειρά.
Δεδομένου ότι οι συμβολοσειρές είναι πραγματικά πίνακες στη C, μπορείτε να αποκτήσετε πρόσβαση σε μια συμβολοσειρά αναφερόμενοι στον αριθμό δείκτη του μέσα σε αγκύλες [].
Στο παρακάτω παράδειγμα εκτυπώνεται ο πρώτος χαρακτήρας (0) στη συμβολοσειρά greetings:
char greetings[6] = "Hello"; printf("The first character in the greetings string is: %c", greetings[0]);
Στο παραπάνω παράδειγμα, η συμβολοσειρά greetings περιέχει το κείμενο “Hello”. Με τη χρήση του greetings[0] εκτυπώνεται ο πρώτος χαρακτήρας της συμβολοσειράς “H”.
[adinserter block=”2″]
Για να αλλάξετε την τιμή ενός συγκεκριμένου χαρακτήρα σε μια συμβολοσειρά, αναφερθείτε στον αριθμό δείκτη και χρησιμοποιήστε μονά εισαγωγικά:
Παράδειγμα:
char greetings[6] = "Hello"; greetings[0] = 'J'; printf("The new string is: %s", greetings);
Στο παραπάνω παράδειγμα, η συμβολοσειρά greetings αρχικά περιλαμβάνει το κείμενο “Hello”. Χρησιμοποιώντας τη γραμμή κώδικα greetings[0] = ‘J’, η τιμή του πρώτου χαρακτήρα της συμβολοσειράς αλλάζει από “H” σε “J”. Η συνάρτηση printf () χρησιμοποιείται στη συνέχεια για να εκτυπώσει τη νέα τιμή της συμβολοσειράς.
Μπορείτε επίσης να διασχίσετε τους χαρακτήρες μιας συμβολοσειράς, χρησιμοποιώντας έναν βρόχο for:
Παράδειγμα:
char greetings[6] = "Hello"; int i; for (i = 0; i < 5; i++) { printf("%c\n", greetings[i]); }
Στο παραπάνω παράδειγμα, η συμβολοσειρά greetings περιέχει το κείμενο “Hello”. Με τη χρήση ενός βρόχου for, η συνάρτηση printf () εμφανίζει κάθε χαρακτήρα της συμβολοσειράς ξεχωριστά. Η μεταβλητή i αυξάνεται κατά ένα σε κάθε επανάληψη του βρόχου, με αποτέλεσμα να εκτυπώνεται κάθε χαρακτήρας της συμβολοσειράς.
Στα παραδείγματα παραπάνω, χρησιμοποιήσαμε ένα “αλφαριθμητικό” για να δημιουργήσουμε μια μεταβλητή συμβολοσειράς. Αυτό είναι το ευκολότερος τρόπος για να δημιουργήσετε μια συμβολοσειρά στη C.
Πρέπει επίσης να σημειώσετε ότι μπορείτε να δημιουργήσετε μια συμβολοσειρά με ένα σύνολο χαρακτήρων. Το παρακάτω παράδειγμα θα δημιουργήσει το ίδιο αποτέλεσμα με το παράδειγμα στην αρχή αυτής της σελίδας:
Παράδειγμα:
char greetings[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; printf("The string is: %s", greetings);
Στο παραπάνω παράδειγμα, η συμβολοσειρά greetings δημιουργείται με ένα σύνολο χαρακτήρων. Η μεταβλητή greetings αποτελείται από έναν πίνακα χαρακτήρων με μέγεθος 6. Ο τελευταίος χαρακτήρας του πίνακα είναι ο χαρακτήρας ‘\0’, ο οποίος χρησιμοποιείται για να δείξει ότι η συμβολοσειρά έχει τελειώσει. Η συνάρτηση printf () χρησιμοποιείται για να εκτυπώσει τη συμβολοσειρά.
Η διαφορά μεταξύ των δύο τρόπων δημιουργίας συμβολοσειρών, είναι ότι ο πρώτος τρόπος είναι πιο εύκολος στην εγγραφή, και δεν χρειάζεται να συμπεριλάβετε τον χαρακτήρα \0, καθώς η C θα το κάνει αυτό για εσάς.
Θα πρέπει να σημειώσετε ότι το μέγεθος και των δύο πινάκων είναι το ίδιο: Και οι δύο έχουν 13 χαρακτήρες (ο κενός χώρος μετράει ως χαρακτήρας με τον τρόπο), συμπεριλαμβανομένου του χαρακτήρα \0:
Ένα παράδειγμα θα μπορούσε να είναι η δημιουργία δύο συμβολοσειρών ως εξής:
char str1[] = "Hello World"; char str2[12] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\0'};
Και οι δύο συμβολοσειρές έχουν την ίδια τιμή, αλλά η πρώτη είναι ευκολότερη στην εγγραφή, ενώ η δεύτερη σας επιτρέπει να ελέγχετε απευθείας κάθε χαρακτήρα.
[adinserter block=”3″]
Για να αναγνωρίσει η C τα ειδικά χαρακτήρες στις συμβολοσειρές, μπορείτε να χρησιμοποιήσετε απόπειρες και επιστροφής \, που ακολουθούνται από έναν χαρακτήρα που καθορίζει τη σημασία του ειδικού χαρακτήρα. Μερικοί από τους συνηθέστερους ειδικούς χαρακτήρες στη C είναι:
- \n: νέα γραμμή
- \t: καρτέλα (διάστημα του ελέγχου)
- \b: πίσω κενό (κατάργηση)
- \r: επιστροφή κέρσορα
- \”: εισαγωγικά
- \’: μονά εισαγωγικά
- \: κάθετη γραμμή (backslash)
Μπορείτε να χρησιμοποιήσετε αυτούς τους ειδικούς χαρακτήρες μαζί με τα κανονικά γράμματα και αριθμούς για να δημιουργήσετε συμβολοσειρές που περιέχουν ειδικούς χαρακτήρες.
Ο χαρακτήρας απόπειρας και επιστροφής () χρησιμοποιείται στη C ως χαρακτήρας διαφυγής (escape character) για να μετατρέψει ειδικούς χαρακτήρες σε χαρακτήρες στις συμβολοσειρές.
Για παράδειγμα, ο χαρακτήρας \n αναπαριστά μια νέα γραμμή, και ο χαρακτήρας \ αναπαριστά ένα backslash. Έτσι, αν θέλατε να δημιουργήσετε μια συμβολοσειρά που περιέχει ένα μονάδικο εισαγωγικό, θα μπορούσατε να το κάνετε ως εξής:
char myString[] = "This string contains a single quote: \'";
Με αυτόν τον τρόπο, η C θα αντιληφθεί ότι ο μοναδικός χαρακτήρας εισαγωγικών στη συμβολοσειρά δεν αποτελεί το τέλος της συμβολοσειράς, αλλά είναι ένας χαρακτήρας της συμβολοσειράς.
Το είναι ένα από τα κύρια header αρχεία της C που περιλαμβάνει πολλές χρήσιμες συναρτήσεις για τις συμβολοσειρές.
Ας δούμε μερικές από τις βασικές συναρτήσεις συμβολοσειρών στη C:
strlen(): Επιστρέφει το μήκος μιας συμβολοσειράς.
strcpy(): Αντιγράφει τη μια συμβολοσειρά σε μια άλλη.
strcat(): Συνενώνει δύο συμβολοσειρές σε μία.
strcmp(): Συγκρίνει δύο συμβολοσειρές και επιστρέφει μια τιμή που δείχνει αν είναι ίσες ή όχι.
strstr(): Βρίσκει την πρώτη εμφάνιση ενός υποσυνόλου σε μια συμβολοσειρά.
Ας δούμε ένα παράδειγμα για τη χρήση της συνάρτησης strlen():
#include <stdio.h> #include <string.h> int main() { char myString[20] = "Hello, world!"; int length = strlen(myString); printf("The length of the string is: %d", length); return 0; }
Αυτός ο κώδικας θα εκτυπώσει το μήκος της συμβολοσειράς “Hello, world!”, δηλαδή 13.
Η συνάρτηση strlen() επιστρέφει το μήκος μιας συμβολοσειράς. Ας δούμε ένα παράδειγμα:
#include <stdio.h> #include <string.h> int main() { char myString[20] = "Hello, world!"; int length = strlen(myString); printf("The length of the string is: %d", length); return 0; }
Αυτός ο κώδικας θα εκτυπώσει το μήκος της συμβολοσειράς “Hello, world!”, δηλαδή 13.
Η συνάρτηση sizeof() επιστρέφει το μέγεθος μιας μεταβλητής ή ενός πίνακα σε bytes. Όπως αναφέρατε, η sizeof() περιλαμβάνει και τον χαρακτήρα \0 που χρησιμοποιείται για να σηματοδοτήσει το τέλος της συμβολοσειράς, ενώ η συνάρτηση strlen() δεν τον υπολογίζει στο μήκος της συμβολοσειράς.
[adinserter block=”4″]
Είναι σημαντικό να το γνωρίζει κάποιος γιατί αυτή η διαφορά μπορεί να προκαλέσει προβλήματα κατά την ανάγνωση ή την εγγραφή συμβολοσειρών σε μνήμη, και μπορεί επίσης να επηρεάσει το μέγεθος του αντίστοιχου πίνακα που χρησιμοποιείται για να αποθηκεύσει τη συμβολοσειρά.
Ας δούμε ένα παράδειγμα για να καταλάβουμε τη διαφορά μεταξύ της συνάρτησης sizeof() και strlen():
#include <stdio.h> #include <string.h> int main() { char myString[] = "Hello"; int size = sizeof(myString); int length = strlen(myString); printf("The size of the string is: %d\n", size); printf("The length of the string is: %d\n", length); return 0; }
Η παραπάνω εφαρμογή θα εκτυπώσει:
The size of the string is: 6 The length of the string is: 5
Παρατηρούμε ότι το μέγεθος της συμβολοσειράς είναι 6, ενώ το μήκος της συμβολοσειράς είναι 5. Αυτό συμβαίνει επειδή το μέγεθος του πίνακα που χρησιμοποιείται για να αποθηκεύσει τη συμβολοσειρά περιλαμβάνει επίσης τον χαρακτήρα \0 που χρησιμοποιείται για να σηματοδοτήσει το τέλος της συμβολοσειράς.
Για να συνενώσετε (concatenate) δύο συμβολοσειρές στη C, μπορείτε να χρησιμοποιήσετε τη συνάρτηση strcat().
Η συνάρτηση strcat() παίρνει δύο ορίσματα: τη συμβολοσειρά που θέλετε να προσθέσετε τη δεύτερη συμβολοσειρά. Η δεύτερη συμβολοσειρά προστίθεται στο τέλος της πρώτης συμβολοσειράς. Η πρώτη συμβολοσειρά πρέπει να έχει αρκετό χώρο για να χωρέσει τη δεύτερη συμβολοσειρά, συμπεριλαμβανομένου του τελικού χαρακτήρα \0 που σηματοδοτεί το τέλος της συμβολοσειράς.
Δείτε ένα παράδειγμα:
#include <stdio.h> #include <string.h> int main() { char str1[20] = "Hello"; char str2[20] = " World"; strcat(str1, str2); printf("%s\n", str1); return 0; }
Η παραπάνω εφαρμογή θα εκτυπώσει:
Hello World
Παρατηρούμε ότι η συνάρτηση strcat() προσθέτει τη δεύτερη συμβολοσειρά (” World”) στο τέλος της πρώτης συμβολοσειράς (“Hello”), και εκτυπώνει την πλήρη συμβολοσειρά “Hello World”.
Για να αντιγράψετε την τιμή μιας συμβολοσειράς σε μια άλλη, μπορείτε να χρησιμοποιήσετε τη συνάρτηση strcpy().
[adinserter block=”5″]
Η συνάρτηση strcpy() παίρνει δύο ορίσματα: τη συμβολοσειρά προορισμού και τη συμβολοσειρά πηγής. Η τιμή της συμβολοσειράς πηγής αντιγράφεται στη συμβολοσειρά προορισμού. Η συμβολοσειρά προορισμού πρέπει να έχει αρκετό χώρο για να χωρέσει τη συμβολοσειρά πηγής, συμπεριλαμβανομένου του τελικού χαρακτήρα \0 που σηματοδοτεί το τέλος της συμβολοσειράς.
Δείτε ένα παράδειγμα:
#include <stdio.h> #include <string.h> int main() { char str1[20] = "Hello"; char str2[20]; strcpy(str2, str1); printf("%s\n", str2); return 0; }
Η παραπάνω εφαρμογή θα εκτυπώσει:
Hello
Παρατηρούμε ότι η συνάρτηση strcpy() αντιγράφει την τιμή της συμβολοσειράς προέλευσης (“Hello”) στη συμβολοσειρά προορισμού (str2), και εκτυπώνει τη συμβολοσειρά προορισμού.
Για να συγκρίνετε δύο αλφαριθμητικά στη C, μπορείτε να χρησιμοποιήσετε τη συνάρτηση strcmp().
Η συνάρτηση αυτή επιστρέφει την τιμή 0 εάν τα δύο αλφαριθμητικά είναι ίσα, διαφορετικά επιστρέφει μια τιμή που δεν είναι 0.
Ας δούμε ένα παράδειγμα χρησιμοποιώντας τη συνάρτηση strcmp() στη C:
#include <stdio.h> #include <string.h> int main() { char str1[20] = "Hello"; char str2[20] = "World"; if (strcmp(str1, str2) == 0) { printf("The two strings are equal\n"); } else { printf("The two strings are not equal\n"); } return 0; }
Σε αυτό το παράδειγμα, έχουμε δηλώσει δύο αλφαριθμητικά str1
και str2
. Στη συνέχεια, χρησιμοποιούμε τη συνάρτηση strcmp()
για να συγκρίνουμε τα δύο αλφαριθμητικά. Η συνθήκη if
ελέγχει εάν η τιμή που επιστρέφει η συνάρτηση strcmp()
είναι ίση με το μηδέν. Εάν ναι, τότε τα δύο αλφαριθμητικά είναι ίσα και εκτυπώνεται το μήνυμα “Τα δύο αλφαριθμητικά είναι ίσα”. Διαφορετικά, εκτυπώνεται το μήνυμα “Τα δύο αλφαριθμητικά δεν είναι ίσα”.
Αν τρέξουμε αυτόν τον κώδικα, το αποτέλεσμα θα είναι “Τα δύο αλφαριθμητικά δεν είναι ίσα”, διότι τα αλφαριθμητικά “Hello” και “World” είναι διαφορετικά.