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 erstellst du eine Funktion, die Kontaktinformationen formatiert anzeigt. In dieser Lektion werden drei neue Zeichenkettenfunktionen vorgestellt, die du benötigst: fgets(), strcspn() und strchr(): Jede wird im Folgenden vor den Anforderungen erklärt.
Neue Funktionen in dieser Lektion:
fgets(buffer, size, stdin): liest eine Eingabezeile einschließlich Leerzeichen (anders alsscanf, das bei Leerraumzeichen 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 vonfgetszurückgelassenen Zeilenumbruch am Ende zu entfernen:str[strcspn(str, "\n")] = '\0';strchr(str, ch): sucht instrnach dem Zeichenchund gibt einen Zeiger auf dessen Position zurück oderNULL, falls es nicht gefunden wird.
Dein Programm sollte Folgendes tun:
- Dieselbe
Contact-Strukturdefinition wie in den vorherigen Lektionen verwenden, mit den Elementen:- 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 Funktion
createContactwie in den vorherigen Lektionen verwenden, die:- Speicher für eine
Contact-Struktur dynamisch reserviert - Alle Elemente mit Standardwerten initialisiert
- Einen Zeiger auf den Kontakt zurückgibt
- Speicher für eine
- Eine Funktion
populateContactschreiben, die:- Einen Zeiger auf eine
Contact-Struktur als Parameter entgegennimmt fgets()verwendet, um jedes Zeichenkettenfeld (name, phone, email) einzulesen, sodass Namen mit Leerzeichen akzeptiert werdenstrcspn()verwendet, um nach dem Einlesen den abschließenden Zeilenumbruch aus jedem Zeichenkettenfeld zu entfernenscanf("%d", ...)verwendet, um das Ganzzahlfeld age einzulesen- Vor dem Einlesen jedes Feldes genau die entsprechende Eingabeaufforderung ohne nachfolgenden Zeilenumbruch ausgibt:
Enter name:,Enter phone:,Enter email:,Enter age:(sodass=== CONTACT DETAILS ===in derselben Zeile aufEnter age:folgt) - Hinweis: Diese Version von
populateContactenthält keine Längenprüfung für Telefonnummern: Füge sie nicht hinzu, da in den Testeingaben kurze Telefonnummern wie555-1234verwendet werden
- Einen Zeiger auf eine
- Eine Funktion namens
displayContactschreiben, die:- Einen Zeiger auf eine konstante
Contact-Struktur als Parameter entgegennimmt:const struct Contact *contactPtr - Nichts zurückgibt (void)
- Die Kontaktinformationen genau in 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 ausgibt:
- Die Länge des Namens mit
strlen()berechnet und Folgendes ausgibt:Name length: [length] characters - Die Alterskategorie bestimmt und Folgendes 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:
- Mit
strchr()prüft, ob die E-Mail-Adresse das Zeichen'@'enthält, und Folgendes ausgibt:- Wenn
'@'gefunden wird:Email format: Valid - Wenn
'@'nicht gefunden wird:Email format: Invalid
- Wenn
- Die Länge des Namens mit
- Einen Zeiger auf eine konstante
- In der Hauptfunktion:
- Mit der Funktion
createContacteinen Kontakt erstellen - Prüfen, ob der Kontakt erfolgreich erstellt wurde
- Die Funktion
populateContactaufrufen, um die Kontaktdaten einzutragen - Die Funktion
displayContactaufrufen, um die formatierten Kontaktinformationen anzuzeigen - Den dynamisch reservierten Speicher freigeben
Program completed successfullyausgeben
- Mit der Funktion
Diese Aufgabe zeigt, wie eine Anzeigefunktion erstellt wird, die einen Zeiger auf eine konstante Struktur entgegennimmt und so sicherstellt, dass die Funktion die ursprünglichen Daten nicht ändern kann. Du übst den Einsatz von fgets(), um Zeichenketten mit Leerzeichen einzulesen, von strcspn(), um abschließende Zeilenumbrüche zu entfernen, des Pfeiloperators, um über einen Zeiger auf Strukturelemente zuzugreifen, von strchr() zur Zeichensuche und von bedingter Logik zur Datenkategorisierung. Die Verwendung von const in der Parameterdeklaration ist eine gute Praxis, die versehentliche Änderungen 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