#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;
Wofür werden Typdefinitionen genutzt?
- Bessere Lesbarkeit großer Programme
- Bessere Portierbarkeit eines Programms, da nur die abstrakten Datentypen an die
neue Umgebung angepasst werden müssen
Was ist das Ziel von Strukturen? Nenne auch die Syntax.
Ziel: Zusammenfassung der Attribute mit unterschiedlichem Datentypen in
einem neuen Datentyp.
Beispiel: ein Kunde wird durch Namen und Adresse sowie Kundennummer
definiert.
Syntax:
struct [Typname] {
Komponente1;
[Komponente2; …]
} [VarName1, …];
Was sind die zulässigen Operationen für Strukturen?
- Übergabe an Funktionen als Parameter (call by value!)
- Rückgabe einer Struktur aus einer Funktion
- Zuweisungsoperator für gesamte Struktur (Kopie wird erzeugt)
- Adress- und sizeof-Operator
- Elementzugriffsoperator: Punkt (.)
Wie werden die Attribute einer Struktur bei der Deklaration gesetzt?
Direkte Zuweisung von Attributen: Die Attribute einer Struktur können direkt bei der Deklaration gesetzt werden.
Beispiel:
struct Spieler {
char name[50];
int alter;
long punktzahl;
};
struct Spieler bob = {“Bob”, 12, 20000};
Welcher Operator erlaubt den Zugriff auf Inhalte von Strukturen über Zeiger?
Operator: ->
Beispiel:
typedef struct s_kunde {
char name[64];
int alter;
} kunde;
kunde k1;
kunde *zeiger = &k1;
Normalerweise: (*zeiger).alter = 20;
Besser: zeiger->alter = 20;
Was sind die Eigenschaften von Bitfeldern?
- Bitfelder dienen zur Verringerung des Speicherbedarfs und leichteren Zugriff auf einzelne Bits.
- Die Syntax ist analog zu struct, hinter jedes Element wird die Anzahl der
benötigten Bits geschrieben.
Beispiel für Bitfeld (1 Byte groß):
struct zeichen {
unsigned char data:7;
unsigned char parity:1;
};
Achtung: Das Bitfeld belegt mindestens so viel Speicher wie der größte
enthaltene Datentyp.
Was sind die Eigenschaften von Unions?
- Syntax analog zu Strukturen, Schlüsselwort union statt struct
- Es wird jedoch nur einer der Werte gespeichert.
- Speicherbedarf der Union richtet sich nach dem größten Element.
- Beispiel:
union typen {
int i;
double d;
} u;
u.i = 5;
u.d = 2.3;
(u.i ist nun undefiniert)
Wofür werden Unions genutzt?
- Einsparen von Speicherplatz: wenn sichergestellt ist, dass manche
Informationen nicht gleichzeitig gespeichert werden müssen. - Maschinennahe Manipulation: Interpretation eines Speicherbereichs durch
verschiedene Datentypen (z.B. um auf Gleitkommazahlen auch
Bitmanipulationen durchführen zu können).
Achtung: Solche Programme sind i.d.R. nicht portierbar! - Bessere Lesbarkeit