Funktion zum Anzeigen eines Kontakts
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 53 von 63.
Aufgabe
EinfachAufbauend 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 alsscanf, das beim Leerraum stoppt). Die Eingabe wird inbuffergespeichert, wobei höchstenssize - 1Zeichen gelesen werden. Außerdem wird am Ende das Zeilenumbruchzeichen'\n'gespeichert.strcspn(str, "\n"): gibt den Index des ersten Vorkommens von'\n'instrzurück. Wird verwendet, um den vonfgetshinterlassenen abschließenden Zeilenumbruch zu entfernen:str[strcspn(str, "\n")] = '\0';strchr(str, ch): sucht das Zeichenchinstrund gibt einen Zeiger auf seine Position zurück oderNULL, wenn es nicht gefunden wurde.
Dein Programm sollte:
- Dieselbe
Contact-Strukturdefinition wie in den vorherigen Lektionen verwenden, mit den folgenden Mitgliedern:- Ein Zeichenarray
namemit der Größe 50 - Ein Zeichenarray
phonemit der Größe 20 - Ein Zeichenarray
emailmit der Größe 40 - Eine Ganzzahl
age
- Ein Zeichenarray
- 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
- Speicher für eine
- 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 werdenstrcspn()verwendet, um nach dem Lesen den abschließenden Zeilenumbruch aus jedem Zeichenkettenfeld zu entfernenscanf("%d", ...)verwendet, um das Ganzzahlfeld für das Alter zu lesen- Hinweis: Diese Version von
populateContactenthält keine Validierung der Länge der Telefonnummer: Füge sie nicht hinzu, da die Testeingaben kurze Telefonnummern wie555-1234verwenden
- Einen Zeiger auf eine
- Eine Funktion namens
displayContactschreiben, 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
- Wenn das Alter zwischen 0 und 12 liegt:
- Mit
'@'prüfen, ob die E-Mail-Adresse das Zeichenstrchr()enthält, und Folgendes ausgeben:- Wenn
'@'gefunden wird:Email format: Valid - Wenn
'@'nicht gefunden wird:Email format: Invalid
- Wenn
- Die Länge des Namens mithilfe von
- Einen konstanten Zeiger auf eine
- In der main-Funktion:
- Einen Kontakt mithilfe der Funktion
createContacterstellen - Prüfen, ob die Erstellung des Kontakts erfolgreich war
- Die Funktion
populateContactaufrufen, um die Kontaktdaten einzugeben - Die Funktion
displayContactaufrufen, um die formatierten Kontaktinformationen anzuzeigen - Den dynamisch reservierten Speicher freigeben
Program completed successfullyausgeben
- Einen Kontakt mithilfe der Funktion
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
1Zeiger-Grundlagen
Was ist ein Zeiger?Zeiger deklarierenDer Adressoperator (&)Der Dereferenzierungsoperator (*)NULL-ZeigerZusammenfassung: Zeiger-Grundlagen4Projekt: Einfaches Text-Tool
ProjektübersichtZeichen zählen2Pointer und Arrays
Array-Namen als PointerArray-Elemente - PointerPointer-ArithmetikPointer vergleichenWiederholung: Array-Durchlauf mit Pointern5Zeiger und Funktionen
Wertübergabe (Pass-by-Value)Zeiger an Funktionen übergebenVariablen über Zeiger ändernEin klassisches Beispiel: SwapArrays an Funktionen übergebenZusammenfassung: Zeiger als Funktionsargumente8Structs und Zeiger
Zeiger auf StructsDer Pfeiloperator (->)Structs per Wert übergebenÜbergabe von Struct-ZeigernDynamische Allokation von StructsZusammenfassung: Struct ändern - Ptr11Finale Wiederholungsaufgaben
Wiederholung: Dynamische String-KonkatenationWiederholung: Array von StructsWiederholung: Wortfrequenz-Zähler3Character-Arrays und Strings
Strings als char-ArraysDer Null-TerminatorString-Eingabe mit scanfVerwendung von strlen()Verwendung von strcpy()Verwendung von strcat()Verwendung von strcmp()Zusammenfassung: Grundlegende String-Funktionen6Speicherverwaltung
Stack vs. Heap SpeicherDynamische Allokation - malloc()Verwendung von sizeof() für die AllokationÜberprüfung auf AllokationsfehlerSpeicher freigeben mit free()Allokation mit calloc()Rückblick: Dynamische Arrays9Projekt: Einfache Kontakteingabe
Projekt: Kontakt-Struct definierenFunktion zum Erstellen eines KontaktsÜbe selbstständig: Online-C-Compiler