Κατηγοριοποίηση χαρακτήρων |
Το πρόγραμμα του αρχείου CHARCLAS.C αποτελεί ένα παράδειγμα μέτρησης διαφόρων κατηγοριών χαρακτήρων. Οι πιό συνηθισμένες κατηγορίες χαρακτήρων είναι τα γράμματα, τα ψηφία, το διαστημα, τα σημεία στίξης και οι μη εκτυπώσιμοι χαρακτήρες ελέγχου. Επίσης υπάρχουν οι χαρακτήρες γραφικών και τα εθνικά αλφάβητα που αντιστοιχούν στο επεκταμένο κώδικα ASCII (κωδικοί 128 έως 255). Oρισμένα σημεία στίξης και χαρακτήρες ελέγχου λόγω της ειδικής σημασίας που έχουν στο αλφάβητο της C μπορεί να δημιουργήσουν πρόβλημα εάν περιληφθούν σε κάποια συμβολοσειρά. Γι' αυτό το λόγο αντικαθίστανται από ειδικές 'ακολουθίες διαφυγής' (escape sequences) οι οποίες ξεκινούν με το χαρακτήρα '\'. Ήδη έχουμε συνατήσει την ακολουθία διαφυγής '\n' που αντιστοιχεί στο συνδυασμό CR-LF. Ορισμένες άλλες ακολουθίες είναι οι \n νέα γραμμή \t στηλοθέτηση \b επιστροφή \" διπλό εισαγωγικό \\ ανάποδη κάθετος \0 χαρακτήρας με κωδικό ASCII 0 Ειδικά με τη σύμβαση της τελευταίας ακολουθίας διαφυγής μπορούμε να παραστήσουμε οποιοδήποτε χαρακτήρα ASCII με τον κωδικό του. Γιά περισσότερες πληροφορίες ανατρέξετε στο εγχειρίδιο του μεταφραστή σας. Εάν προσθέσουμε μιά ακόμη κάθετο πριν από μιά ακολουθία ελέγχου τότε αυτή παύει να αποτελεί κάτι το ιδιαίτερο και εκλαμβάνεται από το μεταφραστή σαν μιά απλή σειρά χαρακτήρων. Οι τρείς συναρτήσεις βιβλιοθήκης γιά τη κατηγοριοποίηση χαρακτήρων που παρουσιάζονται στο πρόγραμμα που ακολουθεί είναι οι παρακάτω isalpha(c) ελέγχει αν ο c είναι γράμμα isdigit(c) ελέγχει αν ο c είναι ψηφίο isspace(c) ελέγχει αν ο c είναι διάστημα \n ή \t Οι περισσότεροι μεταφραστές έχουν και άλλες σχετικές συναρτήσεις. Το πρόγραμμα διαβάζει ένα αρχείο γραμμή-γραμμή και μετρά το πλήθος των χαρακτήρων κάθε κατηγορίας (γράμματα, ψηφία ή κενά) σε κάθε γραμμή. Στη συνέχεια εμφανίζει τους τρείς αριθμούς και τη γραμμή που διάβασε. Η εκτύπωση που ακολουθεί αντιστοιχεί στην εκτέλεση του προγράμματος με αρχείο κειμένο το κείμενο του ίδιου του προγράμματος, δηλαδή το αρχείο CHARCLAS.C. 5 32 0 /* Character classification functions */ 1 0 0 2 13 0 #include <stdio.h> 18 43 0 #include <ctype.h> /* Note - your compiler may not need this */ 1 0 0 3 24 0 void count_the_data(char line[]); 1 0 0 2 8 0 void main() 1 0 0 { 2 6 0 FILE *fp; 3 16 4 char line[80], filename[24]; 2 5 0 char *c; 1 0 0 7 19 0 printf("Enter filename -> "); 4 14 0 scanf("%s",filename); 6 16 0 fp = fopen(filename,"r"); 1 0 0 5 2 0 do { 18 26 2 c = fgets(line,80,fp); /* get a line of text */ 11 7 0 if (c != NULL) { 10 16 0 count_the_data(line); 7 0 0 } 8 10 0 } while (c != NULL); 1 0 0 4 8 0 fclose(fp); 1 0 0 } 1 0 0 3 24 0 void count_the_data(char line[]) 1 0 0 { 4 20 0 int whites, chars, digits; 2 8 0 int index; 1 0 0 10 17 1 whites = chars = digits = 0; 1 0 0 10 22 2 for (index = 0;line[index] != 0;index++) { 18 36 1 if (isalpha(line[index])) /* 1 if line[] is alphabetic */ 11 5 0 chars++; 22 32 1 if (isdigit(line[index])) /* 1 if line[] is a digit */ 11 6 0 digits++; 18 34 1 if (isspace(line[index])) /* 1 if line[] is blank, tab, */ 45 15 0 whites++; /* or newline */ 12 17 0 } /* end of counting loop */ 1 0 0 5 31 3 printf("%3d%3d%3d %s",whites,chars,digits,line); 1 0 0 } |
![]() |
![]() |
![]() |