Menu
Coddy logo textTech

Funktion zum Anzeigen eines Kontakts

Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 53 von 63.

challenge icon

Aufgabe

Einfach

Aufbauend auf deinem Kontaktverwaltungssystem aus den vorherigen Lektionen sollst du eine Funktion erstellen, die Kontaktinformationen in formatierter Weise anzeigt. In dieser Lektion werden drei neue String-Funktionen eingeführt, die du benötigen wirst: fgets(), strcspn() und strchr(); jede wird weiter unten vor den Anforderungen erklärt.

Neue Funktionen, die in dieser Lektion verwendet werden:

  • fgets(buffer, size, stdin): liest eine Eingabezeile einschließlich Leerzeichen (anders als scanf, das beim Leerraum stoppt). Die Eingabe wird in buffer gespeichert, wobei höchstens size - 1 Zeichen gelesen werden. Außerdem wird am Ende das Zeilenumbruchzeichen '\n' gespeichert.
  • strcspn(str, "\n"): gibt den Index des ersten Vorkommens von '\n' in str zurück. Wird verwendet, um den von fgets hinterlassenen abschließenden Zeilenumbruch zu entfernen: str[strcspn(str, "\n")] = '\0';
  • strchr(str, ch): sucht das Zeichen ch in str und gibt einen Zeiger auf seine Position zurück oder NULL, wenn es nicht gefunden wurde.

Dein Programm sollte:

  1. Dieselbe Contact-Strukturdefinition wie in den vorherigen Lektionen verwenden, mit den folgenden Mitgliedern:
    • Ein Zeichenarray name mit der Größe 50
    • Ein Zeichenarray phone mit der Größe 20
    • Ein Zeichenarray email mit der Größe 40
    • Eine Ganzzahl age
  2. Dieselbe createContact-Funktion wie in den vorherigen Lektionen verwenden, die:
    • Speicher für eine Contact-Struktur dynamisch reserviert
    • Alle Mitglieder mit Standardwerten initialisiert
    • Einen Zeiger auf den Kontakt zurückgibt
  3. Eine populateContact-Funktion schreiben, die:
    • Einen Zeiger auf eine Contact-Struktur als Parameter entgegennimmt
    • fgets() verwendet, um jedes Zeichenkettenfeld (Name, Telefonnummer, E-Mail-Adresse) zu lesen, sodass Namen mit Leerzeichen akzeptiert werden
    • strcspn() verwendet, um nach dem Lesen den abschließenden Zeilenumbruch aus jedem Zeichenkettenfeld zu entfernen
    • scanf("%d", ...) verwendet, um das Ganzzahlfeld für das Alter zu lesen
    • Hinweis: Diese Version von populateContact enthält keine Validierung der Länge der Telefonnummer: Füge sie nicht hinzu, da die Testeingaben kurze Telefonnummern wie 555-1234 verwenden
  4. Eine Funktion namens displayContact schreiben, die:
    • Einen konstanten Zeiger auf eine Contact-Struktur als Parameter entgegennimmt: const struct Contact *contactPtr
    • Nichts zurückgibt (void)
    • Die Kontaktinformationen in genau diesem Format ausgibt:
      • === CONTACT DETAILS ===
      • Name: [name]
      • Phone: [phone]
      • Email: [email]
      • Age: [age] years old
      • ========================
    • Nach der Anzeige der grundlegenden Informationen zusätzliche Details berechnet und anzeigt:
      • Die Länge des Namens mithilfe von strlen() berechnen und ausgeben: Name length: [length] characters
      • Die Generationskategorie anhand des Alters bestimmen und ausgeben:
        • Wenn das Alter zwischen 0 und 12 liegt: Generation: Child
        • Wenn das Alter zwischen 13 und 19 liegt: Generation: Teenager
        • Wenn das Alter zwischen 20 und 39 liegt: Generation: Young Adult
        • Wenn das Alter zwischen 40 und 59 liegt: Generation: Middle-aged Adult
        • Wenn das Alter 60 oder höher ist: Generation: Senior
      • Mit '@' prüfen, ob die E-Mail-Adresse das Zeichen strchr() enthält, und Folgendes ausgeben:
        • Wenn '@' gefunden wird: Email format: Valid
        • Wenn '@' nicht gefunden wird: Email format: Invalid
  5. In der main-Funktion:
    • Einen Kontakt mithilfe der Funktion createContact erstellen
    • Prüfen, ob die Erstellung des Kontakts erfolgreich war
    • Die Funktion populateContact aufrufen, um die Kontaktdaten einzugeben
    • Die Funktion displayContact aufrufen, um die formatierten Kontaktinformationen anzuzeigen
    • Den dynamisch reservierten Speicher freigeben
    • Program completed successfully ausgeben

Diese Aufgabe zeigt, wie eine Anzeigefunktion erstellt wird, die einen konstanten Zeiger auf eine Struktur entgegennimmt und dadurch sicherstellt, dass die Funktion die ursprünglichen Daten nicht verändern kann. Du übst die Verwendung von fgets(), um Zeichenketten mit Leerzeichen zu lesen, von strcspn(), um abschließende Zeilenumbrüche zu entfernen, des Pfeiloperators, um über einen Zeiger auf Strukturmitglieder zuzugreifen, von strchr() zur Zeichensuche sowie bedingter Logik zur Kategorisierung von Daten. Die Verwendung von const in der Parameterdeklaration ist eine gute Vorgehensweise, die eine versehentliche Änderung der Kontaktdaten innerhalb der Anzeigefunktion verhindert.

Probier es selbst

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char name[50];
    char phone[20];
    char email[40];
    int age;
} Contact;

Contact* createContact() {
    Contact* contact = (Contact*)malloc(sizeof(Contact));
    if (contact == NULL) {
        return NULL;
    }
    
    strcpy(contact->name, "");
    strcpy(contact->phone, "");
    strcpy(contact->email, "");
    contact->age = 0;
    
    return contact;
}

void populateContact(Contact* contactPtr) {
    printf("Enter name: ");
    scanf("%s", contactPtr->name);
    
    printf("Enter phone: ");
    scanf("%s", contactPtr->phone);
    
    printf("Enter email: ");
    scanf("%s", contactPtr->email);
    
    printf("Enter age: ");
    scanf("%d", &contactPtr->age);
    
    if (contactPtr->age < 0 || contactPtr->age > 120) {
        printf("Invalid age entered\n");
    } else if (strlen(contactPtr->phone) < 10) {
        printf("Invalid phone number\n");
    } else {
        printf("Contact populated successfully\n");
    }
}

int main() {
    Contact* contact = createContact();
    
    if (contact == NULL) {
        return 1;
    }
    
    populateContact(contact);
    
    printf("Contact Information:\n");
    printf("Name: %s\n", contact->name);
    printf("Phone: %s\n", contact->phone);
    printf("Email: %s\n", contact->email);
    printf("Age: %d\n", contact->age);
    
    free(contact);
    printf("Contact deleted successfully\n");
    
    return 0;
}

Alle Lektionen in Logik & Ablauf

Übe selbstständig: Online-C-Compiler