Χpήσιµες Βιβλιοθήκες της γλώσσας C Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Συναρτήσεις Επεξεργασίας Συµβολοσειρών (strings) που Παρέχονται από τη Βιβλιοθήκη <string.h> Συναρτήσεις Ελέγχου και Μετατροπής Τύπων εδοµένων ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1
Συναρτήσεις Επεξεργασίας Συµβολοσειρών Όπως έχουµε αναφέρει, µία συµβολοσειρά είναι ένας πίνακας χαρακτήρων στον οποίο τοποθετείται τελευταίος ο χαρακτήρας null ( \0 ), ως ένδειξη του τέλους της συµβολοσειράς. char line[8]; Mπορούµε να χειριστούµε µια συµβολοσειρά µε δύο τρόπους. 1. Αντιµετώπιση της συµβολοσειράς ως έναν πίνακα: line[0] = H ; line[1]= e ; line[3] = l ; line[4]= l ; line[5] = o ; line[6]= \0 ; Αυτό όµως συνεπάγεται σχετική κούραση και δυσκολία. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2
Συναρτήσεις Επεξεργασίας Συµβολοσειρών (συν.) 2. Ο δεύτερος τρόπος ο οποίος προτείνεται είναι µέσω της χρήσης ειδικών συναρτήσεων βιβλιοθήκης που παρέχει η C για επεξεργασία συµβολοσειρών. H σχετική επικεφαλίδα είναι η <string.h>. #include <string.h> char line[8]; strcpy(line, Hello ); Αυτός ο τρόπος για επεξεργασία των συµβολοσειρών κάνει την ασχολία µε συµβολοσειρές εύκολη (σχετικά) υπόθεση. Απαιτείται όµως η αποµνηµόνευση των (βασικών έστω) συναρτήσεων που παρέχει η δεδοµένη βιβλιοθήκη. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 3
Συναρτήσεις Επεξεργασίας Συµβολοσειρών (συν.) Βασικές συναρτήσεις επεξεργασίας συµβολοσειρών: 1. char *strcpy(s1, s2) Η συνάρτηση αυτή αντιγράφει τη συµβολοσειρά s2 στην s1 συµπεριλαµβανοµένου και του χαρακτήρα \0. Επιστρέφει το s1. 2. char *strncpy(s, t, n) Η συνάρτηση αυτή αντιγράφει το πολύ n χαρακτήρες από τη συµβολοσειρά t στην s. Επιστρέφει το s. 3. char *strcat(s, t) Η συνάρτηση αυτή προσθέτει στο τέλος της συµβολοσειράς s το string t. Επιστρέφει το s. 4. char *strncat(s, t, n) Η συνάρτηση αυτή προσθέτει στο τέλος της συµβολοσειράς s το πολύ n χαρακτήρες από τη συµβολοσειρά t και τοποθετεί επίσης και τον χαρακτήρα \0. Επιστρέφει το s. 5. int strcmp(s, t) Η συνάρτηση αυτή συγκρίνει τα δύο strings. Επιστρέφει <0 αν s<t, 0 αν s==t ή >0 αν s>t. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 4
Συναρτήσεις Επεξεργασίας Συµβολοσειρών (συν.) 6. int strncmp(s, t, n) Η συνάρτηση αυτή συγκρίνει το πολύ n χαρακτήρες από το string s µε το string t. Επιστρέφει <0 αν s<t, 0 αν s==t ή >0 αν s>t. 7. char *strpbrk(s, t) Η συνάρτηση αυτή επιστρέφει ένα δείκτη στην πρώτη εµφάνιση στο s οποιουδήποτε χαρακτήρα περιέχεται στο string t, η NULL αν δεν υπάρχει κανένας τέτοιος χαρακτήρας στο s. 8. char *strstr(s, t) Η συνάρτηση αυτή επιστρέφει ένα δείκτη στην πρώτη εµφάνιση στο s της συµβολοσειράς t, η NULL αν το t δεν περιέχεται στο s. 9. int strlen(s) Η συνάρτηση αυτή επιστρέφει το µήκος της συµβολοσειράς s. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 5
Έστω Παρaδείγµατα char a[20] = Kαληµέρα, ; char b[20] = Kαλό µάθηµα! ; Tότε printf( %s, strcpy(a, b)), θα τυπώσει Καλό µάθηµα! printf( %s, strncpy(a, b, 4)), θα τυπώσει Καλόµέρα, printf( %s, strcat(a, b)), θα τυπώσει Καληµέρα, Καλό µάθηµα! printf( %d, strcmp(a, b)), θα τυπώσει κάποια αρνητική τιµή. printf( %s, strpbr(a, ιηυ )), θα τυπώσει ηµέρα,. printf( %s, strstr(a, ηµ )), θα τυπώσει ηµέρα,. printf( %d, strlen(a)), θα τυπώσει 10. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 6
Συναρτήσεις Επεξεργασίας Συµβολοσειρών (συν.) 10. char *strtok(s, t) Η συνάρτηση αυτή ψάχνει στο s για tokens τα οποία διαχωρίζονται µε τους χαρακτήρες που περιγράφονται στο t. Κάθε διαφορετική κλήση της συνάρτησης αυτής επιστρέφει και ένα καινούργιο token. Πιο συγκεκριµένα, η πρώτη κλήση της ακολουθίας έχει σαν πρώτο όρισµα ένα συγκεκριµένο string s. Βρίσκει το πρώτο token που αποτελείται απο χαρακτήρες οι οποίοι δεν περιέχονται στο t, τερµατίζει το token αυτό µε τον χαρακτήρα \0 και τέλος επιστρέφει τον δείκτη προς αυτό το token. Για να βρούµε τα επόµενα tokens που περιέχονται στο s καλούµε επαναληπτικά την συνάρτηση strtok() αλλά τοποθετούµε στη θέση του s την τιµή NULL. Αν δεν υπάρχουν άλλα tokens στο s η συνάρτηση επιστρέφει την τιµή NULL. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 7
Παράδειγµα Na γράψετε πρόγραµµα το οποίο λαµβάνει διευθύνσεις ηλεκτρονικού ταχυδροµείου και επιστρέφει τα πεδία από τα οποία αποτελούνται. Σχετικό παράδειγµα εκτέλεσης $ a.out Please type in an email address: annnap@ucy.ac.cy The fields of this address are: annnap, ucy, ac, cy ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 8
#include <stdio.h> #include <string.h> Παράδειγµα (συν.) int main(void){ char email[] = "user@ucy.ac.cy"; char token[] = "@."; char *c; printf("please type in an email address: "); scanf("%s", email); printf("the fields of this address are: "); c = strtok(email, token); if (c!= NULL) printf("%s", c); while ((c = strtok(null, token))!= NULL) printf(", %s", c); } printf("\n"); ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 9
Συναρτήσεις Επεξεργασίας Συµβολοσειρών (συν.) 11. int sprintf(char *s, const char *format, ) Η συνάρτηση αυτή λειτουργεί ακριβώς όπως η printf() µε τη διαφορά ότι η έξοδος δεν κατευθύνεται προς την οθόνη αλλά φυλάσεται στο string s στο οποίο τοποθετείται επιπλέον και ο χαρακτήρας \0. Επιστρέφεται ο αριθµός των χαρακτήρων που φυλάσσονται στο s πλην του χαρακτήρα \0. 12. int sscanf(char *s, const char *format, ) Η συνάρτηση αυτή λειτουργεί ακριβώς όπως η scanf() µε τη διαφορά ότι η είσοδος των δεδοµένων προέρχεται από το string s και όχι από την οθόνη. Επιστρέφει EOF σε περίπτωση λάθους, ή τον αριθµό των αντικειµένων που ενηµερώθηκαν. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 10
Συναρτήσεις Ελέγχου και Μετατροπής Τύπων Πιο κάτω δίνονται µερικές χρήσιµες συναρτήσεις ελέγχου τύπων οι οποίες βρίσκονται στη βιβλιοθήκη <ctype.h>. Οι συναρτήσεις αυτές παίρνουν όρισµα ένα ακέραιο ο οποίος αντιπροσωπεύει έναν χαρακτήρα στον πίνακα ASCII και επιστρέφουν έναν µη-µηδενικό ακέραιο (true) αν ο χαρακτήρας c ικανοποιεί τη συνθήκη ή µηδέν αν δεν την ικανοποιεί. 1. isalnum(c) δίνει true αν ο c είναι γράµµα ή ψηφίο 2. isalpha(c) δίνει true αν ο c είναι γράµµα 3. iscntrl(c) δίνει true αν ο c είναι control χαρακτήρας 4. isdigit(c) δίνει true αν ο c είναι ψηφίο 5. islower(c) δίνει true αν ο c είναι γράµµα µικρό 6. isspace(c) δίνει true αν ο c είναι ο χαρακτήρας space 7. isupper(c) δίνει true αν ο c είναι γράµµα κεφαλαίο ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 11
Συναρτήσεις Ελέγχου και Μετατροπής Τύπων Μερικές χρήσιµες συναρτήσεις µετατροπής τύπων οι οποίες βρίσκονται στη βιβλιοθήκη <stdlib.h> είναι οι ακόλουθες: 1. double atof(char *s) Η συνάρτηση αυτή µετατρέπει τη συµβολοσειρά s σε έναν αριθµό τύπου double. 2. int atoi(char *s) Η συνάρτηση αυτή µετατρέπει τη συµβολοσειρά s σε έναν αριθµό τύπου ακέραιο. 3. long atol(char *s) Mετατρέπει το s σε αριθµό τύπου long. Άσκηση: Να υλοποιήσετε ένα πρόγραµµα σε C το οποίο να παίρνει ένα σύνολο παραµέτρων. Το πρόγραµµα αυτό θα πρέπει να µετράει πόσες φορές συναντιέται η τελευταία λέξη στα υπόλοιπα ορίσµατα και να εκτυπώνει τον αριθµό αυτό. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 12