#30-32 und #42 -49 Flashcards
30 - Funktionen für Arr und ZeiketIcon 31 - Eigene DatentypenIcon 32 - Datenstrukturen 42 - ModularisierungI 43 - Kommandozeilenparameter
Welche Funktionen gibt es für Arrays?
Kopierfunktionen:
void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
- kopieren n Bytes, Speicherbereiche dürfen sich bei memcpy nicht überlappen
- sind auch für andere Arrays als Strings anwendbar
Achtung: das Stringende-Zeichen \0 wird nicht beachtet!
- Funktionsdefinitionen in string.h
Was sind die Kopierfunktionen für Zeichenketten?
char *strcpy(char *dest, const char *src);
- kopiert Zeichenkette inklusive abschließendem ‘\0’
char *strncpy(char *dest, const char *src, size_t n);
- kopiert maximal n Zeichen, ggf. wird mit Nullen aufgefüllt
- Vorsicht: hat src keine Null in den ersten n Zeichen, ist dest nicht
Nullterminiert!
Was sind Funktionen zum Aneinanderhängen von Zeichenketten?
char *strcat(char *dest, const char *src);
- hängt die Zeichenkette src hinten an dest an
char *strncat(char *dest, const char *src, size_t n);
- hängt maximal n Zeichen der Zeichenkette src hinten an dest an, fügt
\0 hinzu
- Achtung: Die Zielzeichenkette muss genügend Platz für beide Zeichenketten
und das abschließende \0 haben!
Welche Vergleichsfunktionen gibt es für Zeichenketten?
int strcmp(const char *s1, const char *s2);
- Vergleicht zwei mit \0 terminierte Zeichenketten
int strncmp(const char *s1, const char *s2, size_t n);
- Vergleicht zwei mit \0 terminierte Zeichenketten, maximal n Zeichen
int memcmp(const void *s1, const void *s2, size_t n);
- Vergleicht die ersten n Zeichen von zwei beliebigen Arrays
Welchen Rückgabewert erhalten die Vergleichsfunktionen strcmp, strncmp und memcmp?
strcmp:
< 0, wenn s1 kleiner als s2 (d.h. alphabetisch s1 vor s2 kommt, wenn nur
Buchstaben A-Z verwendet werden)
strncmp:
> 0, wenn s1 größer als s2 (d.h. alphabetisch s1 nach s2 kommt, wenn nur
Buchstaben A-Z verwendet werden)
memcmp:
0, wenn s1 gleicher Inhalt wie s2
Welche Suchfunktionen von Zeichenketten gibt es? Nenne jeweils deren Rückgabewert.
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
Rückgabewert: Zeiger auf erstes/letztes Auftreten von c in s
char *strpbrk(const char *s, const char *accept);
Rückgabewert: Zeiger auf erstes Auftreten eines der Zeichen aus accept in s
char *strstr(const char *haystack, const char *needle);
Rückgabewert: Zeiger auf erstes Auftreten von needle in haystack
Wie sieht die Funktion für die Länge einer Zeichenkette aus? Nenne auch den Rückgabewert.
size_t strlen(const char *s);
Rückgabewert: Länge der Zeichenkette s
Was ist die Funktion für das Auffüllen eines Feldes?
void *memset(void *s, int c, size_t n);
Füllt die ersten n Bytes von s mit c
Nenne die Ein-/Ausgabefunktionen von Zeichenketten.
int puts(char *s);
- schreibt die Zeichenkette s und einen nachfolgenden Zeilenumbruch auf den Bildschirm
char *gets(char *s);
- liest eine Zeichenkette und speichert sie in s. Das Return der Eingabe wird in \0
umgewandelt.
Vorsicht: Wenn eingegebener Text länger ist als der Speicherplatz von s, wird über das
Ende von s hinaus in den Speicher geschrieben => Sicherheitsrisiko. Daher besser
folgende Funktion verwenden:
char *fgets(char *s, int size, FILE *stream);
- Für stream verwende stdin, Details im Kapitel Dateioperationen
- Liest bis zum Zeilenumbruch, aber maximal size-1 Zeichen
- \n bleibt erhalten, fügt \0 am Ende an
Funktionsdefinitionen in stdio.h
Wie kann man formatiert in strings schreiben?
Mit sprintf formatiert man in den String str
Syntax: int sprintf(char* str, const char * format, …);
Achtung: Buffer overflow vermeiden!
Womit kann man Zeichenketten in Ganzzahlen und in Gleitkommazahlen umwandeln?
Zeichenkette in Ganzzahl umwandeln:
- int atoi(const char *s)
- long atol(const char *s)
- long strtol(const char *s, char **endp, int base)
- unsigned long strtoul(const char *s, char **endp, int base)
Zeichenkette in Gleitkommazahl umwandeln:
- double atof(const char *s)
- double strtod(const char *s, char **endp)
Beschreibung:
- wandelt Zeichenkette bis zum ersten nichtnumerischen Zeichen
- liefert 0, wenn kein numerisches Zeichen
- s: Zeichenkette
- endp: zeigt auf erstes Zeichen, das nicht konvertiert wurde
- base: Basis des Zahlsystems (2-36, 0 automatische Erkennung)
Was ist das allgemeine Ziel von eigenen Datentypen? Welche gibt es?
Ziel: Bessere Lesbarkeit von Programmen
- Aufzählungstypen (enum)
- Typdefinition (typedef)
Wofür sind Aufzählungstypen gut? Wie sieht die Syntax aus?
Aufzählungstypen können für Variablen definiert werden, denen nur wenige
verschiedene Werte zugewiesen werden sollen.
Syntax:
- enum TypName {Bez1, Bez2, …} [Var1, Var2, …];
- Die Variablennamen sind optional.
Beispiel:
enum tier {hund, katze, maus} t;
t = hund;
Wie erfolgt die Interne Umsetzung von Aufzählungstypen?
- Aufzählungstyp ist int
- Wenn nicht anders festgelegt, werden Bezeichner durch Werte 0, 1, …
repräsentiert (Reihenfolge in der Definition ist wichtig!)
Was sind die Vorteile/Nachteile von Aufzählungstypen?
Vorteil:
- Aussagekräftige Bezeichner machen die Programme lesbarer
und übersichtlicher.
Nachteil:
- Typfremde Zuweisungen an Aufzählungstypen werden meist vom Compiler
nicht erkannt.
- Nur für kleine Wertebereiche anwendbar.
Was sind Typdefinitionen?
- Ein bestehender Datentyp bekommt einen neuen,
alternativen Namen.
Syntax: - typedef Typ TypName;
Beispiel:
enum e_farbe {rot, blau, gruen, gelb};
typedef enum e_farbe farbe;
farbe f;
f = gelb;