Menu
Coddy logo textTech

Funktion zum Anzeigen eines Kontakts

Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 53 von 63.

challenge icon

Aufgabe

Einfach

Aufbauend auf Ihrem Kontaktverwaltungssystem aus den vorangegangenen Lektionen erstellen Sie eine Funktion, die Kontaktinformationen in einer formatierten Weise anzeigt. In dieser Lektion werden drei neue String-Funktionen eingeführt, die Sie benötigen: fgets(), strcspn() und strchr() — jede wird unten vor den Anforderungen erklärt.

In dieser Lektion verwendete neue Funktionen:

  • fgets(buffer, size, stdin) — liest eine Eingabezeile einschließlich Leerzeichen (im Gegensatz zu scanf, das bei Leerzeichen stoppt). Es speichert die Eingabe in buffer und liest maximal size - 1 Zeichen. Es speichert auch das Zeilenumbruchzeichen '\n' am Ende.
  • 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 nach dem Zeichen ch in str und gibt einen Zeiger auf dessen Position zurück, oder NULL, falls es nicht gefunden wurde.

Ihr Programm sollte:

  1. Dieselbe Contact-Strukturdefinition aus den vorherigen Lektionen mit folgenden Elementen verwenden:
    • Ein Zeichen-Array name mit der Größe 50
    • Ein Zeichen-Array phone mit der Größe 20
    • Ein Zeichen-Array email mit der Größe 40
    • Ein Integer age
  2. Dieselbe createContact-Funktion aus den vorherigen Lektionen verwenden, die:
    • Dynamisch Speicher für eine Contact-Struktur reserviert
    • Alle Elemente 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 String-Feld (Name, Telefon, E-Mail) zu lesen, damit Namen mit Leerzeichen akzeptiert werden
    • strcspn() verwendet, um den abschließenden Zeilenumbruch aus jedem String-Feld nach dem Lesen zu entfernen
    • scanf("%d", ...) verwendet, um das Integer-Feld für das Alter zu lesen
    • Hinweis: Diese Version von populateContact enthält keine Validierung der Telefonnummernlänge — fügen Sie diese 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 Basisinformationen zusätzliche Details berechnet und anzeigt:
      • Die Länge des Namens mit strlen() berechnet und ausgibt: Name length: [length] characters
      • Die Generationenkategorie basierend auf dem Alter bestimmt und ausgibt:
        • 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
      • Prüft, ob die E-Mail das Zeichen '@' enthält, indem strchr() verwendet wird, und ausgibt:
        • Wenn '@' gefunden wird: Email format: Valid
        • Wenn '@' nicht gefunden wird: Email format: Invalid
  5. In der Hauptfunktion (main):
    • Einen Kontakt mit der Funktion createContact erstellen
    • Prüfen, ob die Erstellung des Kontakts erfolgreich war
    • Die Funktion populateContact aufrufen, um die Kontaktdaten auszufüllen
    • Die Funktion displayContact aufrufen, um die formatierten Kontaktinformationen anzuzeigen
    • Den dynamisch reservierten Speicher freigeben
    • Program completed successfully ausgeben

Diese Herausforderung zeigt, wie man eine Anzeigefunktion erstellt, die einen konstanten Zeiger auf eine Struktur entgegennimmt, um sicherzustellen, dass die Funktion die ursprünglichen Daten nicht ändern kann. Sie üben die Verwendung von fgets() zum Lesen von Strings, die Leerzeichen enthalten, strcspn() zum Entfernen von abschließenden Zeilenumbrüchen, den Pfeil-Operator zum Zugriff auf Struktur-Elemente über einen Zeiger, strchr() für die Zeichensuche und bedingte Logik für die Datenkategorisierung. Die Verwendung von const in der Parameterdeklaration ist eine gute Praxis, 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 Logic & Flow