Οδηγός Μελέτης - Εισαγωγή στον Προγραμματισμό

Α14.9 · Επεξεργασία συμβολοσειρών

Εργαστήριο 8, Άσκηση 1 · Δυσκολία ★★☆ · programming · Κεφάλαια: 14, 12

1.1 Κατασκευάστε το πρόγραμμα string.c, το οποίο θα συμπεριλαμβάνει το αρχείο επικεφαλίδας string.h και θα πραγματοποιεί το σενάριο που ακολουθεί.

1.2 Ορίστε τις συμβολοσειρές strA και strB με στατική ή δυναμική δέσμευση μνήμης 80 χαρακτήρων.

1.3 Αντιγράψτε στην strA τη συμβολοσειρά "This is a string." και στην strB τη συμβολοσειρά "This is another string." χρησιμοποιώντας την συνάρτηση strcpy.

    char *strcpy(char *s1, const char *s2)

Η συνάρτηση strcpy αντιγράφει τη συμβολοσειρά s2 στην s1 και επιστρέφει την τιμή του δείκτη (char *) στον οποίο έκανε την αντιγραφή (σε αυτό το παράδειγμα επιστρέφει την τιμή της μεταβλητής s1). Χρησιμοποιώντας την printf("%p %p %p\n", ...) τυπώστε τους τρεις δείκτες που συμμετέχουν στην κλήση αυτής της συνάρτησης (s1, s2 και την τιμή επιστροφής της strcpy).

1.4 Υλοποιήστε τη συνάρτηση int mystrlen(char *str) η οποία δέχεται σαν όρισμα μία συμβολοσειρά και επιστρέφει το μήκος της (χωρίς να συμπεριλαμβάνεται ο χαρακτήρας τέλους συμβολοσειράς '\0').

1.5 Υλοποιήστε τη συνάρτηση char *mystrcat(char *s1, char *s2) η οποία προσαρτά ένα αντίγραφο της συμβολοσειράς s2 στο τέλος της s1 και επιστρέφει στο όνομά της έναν δείκτη στην s1.

1.6 Εκτυπώστε τις δύο συμβολοσειρές και το μήκος τους. Υπολογίστε το μήκος της strA μέσω της συνάρτησης mystrlen που υλοποιήσατε παραπάνω και το μήκος της strB μέσω της συνάρτησης strlen της C.

    size_t strlen(const char *s)

Η συνάρτηση strlen επιστρέφει στο όνομά της το μήκος της συμβολοσειράς s (χωρίς να μετράται το τελικό '\0').

1.7 Συγκρίνετε αλφαβητικά τις συμβολοσειρές strA και strB εκτυπώνοντας κατάλληλο μήνυμα.

    int strcmp(const char *s1, const char *s2)

Η συνάρτηση strcmp συγκρίνει τις συμβολοσειρές s1 και s2 χαρακτήρα προς χαρακτήρα με βάση τους αντίστοιχους ASCII κωδικούς. Επιστρέφει:

  1. = 0, αν οι συμβολοσειρές είναι ίδιες
  2. > 0, αν η s1 είναι λεξικογραφικά «μεγαλύτερη» της s2
  3. < 0, αν η s1 είναι λεξικογραφικά «μικρότερη» της s2

1.8 Προσαρτήστε τη συμβολοσειρά strB στο τέλος της strA (χρησιμοποιώντας τη συνάρτηση mystrcat που υλοποιήσατε παραπάνω) και εκτυπώστε το αποτέλεσμα της προσάρτησης. Στη συνέχεια, προσαρτήστε τη νέα τιμή της συμβολοσειράς strA στο τέλος της strB (χρησιμοποιώντας τη συνάρτηση strcat της C) και εκτυπώστε το αποτέλεσμα της προσάρτησης.

    char *strcat(char *s1, const char *s2)

Η strcat προσαρτά / συνενώνει (concatenates) ένα αντίγραφο της συμβολοσειράς s2 στο τέλος της s1 και επιστρέφει στο όνομά της έναν δείκτη στην s1.

1.9 Χρησιμοποιήστε τη συνάρτηση strtok για να εκτυπώσετε μία προς μία τις λέξεις που εμφανίζονται στην τελική συμβολοσειρά strB, χωρίς τους χαρακτήρες στίξης.

    char *strtok(char *string, const char *delim)

Αν το string δεν είναι NULL, η strtok ψάχνει στο string για την πρώτη εμφάνιση συμβολοσειράς που περιορίζεται από έναν από τους χαρακτήρες που εμφανίζονται στη συμβολοσειρά delim. Αν υπάρχει, αντικαθιστά τον χαρακτήρα που βρέθηκε στο string, με '\0' και επιστρέφει έναν δείκτη στην αρχή του string.

Σε κάθε επόμενη κλήση της, η strtok καλείται με NULL στο πρώτο όρισμα και συνεχίζει τη λειτουργία της από το σημείο που η τελευταία κλήση βρήκε τον χαρακτήρα διαχωρισμού. Ένα παράδειγμα χρήσης ακολουθεί με ένα quote:

  char *p, s[] = "Little by little, one Little travels far.";
  p = strtok(s, " ,.");
  while(p != NULL) {
    printf("%s\n", p);
    p = strtok(NULL, " ,.");
  }

Προσθέστε το παραπάνω σε μια συνάρτηση strtok_example και τρέξτε την από την main. Στο stdout θα πρέπει να δείτε μια ακολουθία της μορφής:

Little
by
little
one
Little
travels
far

Υπόδειξη

Μια συμβολοσειρά τελειώνει στο '\0': η mystrlen προχωρά μέχρι να το βρει, και η mystrcat βρίσκει πρώτα το τέλος της s1 και από εκεί αντιγράφει την s2 μαζί με το τελικό '\0'. Στο 1.8 λογαριάστε τα μήκη: χωράει το αποτέλεσμα των δύο συνενώσεων στους 80 χαρακτήρες της strB; Αν όχι, γράφετε έξω από τον πίνακα.

Αριθμός στον οδηγό: Α14.9 (στο κεφάλαιο) · Μόνιμο αναγνωριστικό: lab-lab08-string · Σύνδεσμος: https://progintro.github.io/study/questions/labs/lab-lab08-string.html · Markdown (GitHub)