Funktion zum Anzeigen eines Kontakts
Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 53 von 63.
Aufgabe
EinfachAufbauend 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 zuscanf, das bei Leerzeichen stoppt). Es speichert die Eingabe inbufferund liest maximalsize - 1Zeichen. Es speichert auch das Zeilenumbruchzeichen'\n'am Ende.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 nach dem Zeichenchinstrund gibt einen Zeiger auf dessen Position zurück, oderNULL, falls es nicht gefunden wurde.
Ihr Programm sollte:
- Dieselbe
Contact-Strukturdefinition aus den vorherigen Lektionen mit folgenden Elementen verwenden:- Ein Zeichen-Array
namemit der Größe 50 - Ein Zeichen-Array
phonemit der Größe 20 - Ein Zeichen-Array
emailmit der Größe 40 - Ein Integer
age
- Ein Zeichen-Array
- 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
- Dynamisch Speicher für eine
- 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 werdenstrcspn()verwendet, um den abschließenden Zeilenumbruch aus jedem String-Feld nach dem Lesen zu entfernenscanf("%d", ...)verwendet, um das Integer-Feld für das Alter zu lesen- Hinweis: Diese Version von
populateContactenthält keine Validierung der Telefonnummernlänge — fügen Sie diese 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 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
- Wenn das Alter zwischen 0 und 12 liegt:
- Prüft, ob die E-Mail das Zeichen
'@'enthält, indemstrchr()verwendet wird, und ausgibt:- Wenn
'@'gefunden wird:Email format: Valid - Wenn
'@'nicht gefunden wird:Email format: Invalid
- Wenn
- Die Länge des Namens mit
- Einen konstanten Zeiger auf eine
- In der Hauptfunktion (main):
- Einen Kontakt mit der Funktion
createContacterstellen - Prüfen, ob die Erstellung des Kontakts erfolgreich war
- Die Funktion
populateContactaufrufen, um die Kontaktdaten auszufüllen - Die Funktion
displayContactaufrufen, um die formatierten Kontaktinformationen anzuzeigen - Den dynamisch reservierten Speicher freigeben
Program completed successfullyausgeben
- Einen Kontakt mit der Funktion
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
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