Fortgeschrittene Algorithmen und Programmierung
Wie speichern wir viele Werte vom gleichen Datentyp?
Statt 100 einzelne Variablen zu deklarieren:
int wert1, wert2, wert3, ..., wert100;
Ein Array ist eine Sammlung von Elementen des gleichen Datentyps,
die unter einem gemeinsamen Namen gespeichert werden.
Syntax: datentyp arrayName[anzahl];
int anzahlFeld[3]; // Array mit 3 ganzen Zahlen double preisFeld[3]; // Array mit 3 Fließkommazahlen
⚠️ Wichtig: Arrays beginnen in C immer bei Index 0!
Ein Array mit 3 Elementen hat die Indizes 0, 1, 2.
Elemente werden über den Index angesprochen:
int anzahlFeld[3]; double preisFeld[3]; // Werte zuweisen anzahlFeld[0] = 2; anzahlFeld[1] = 7; anzahlFeld[2] = 3; preisFeld[0] = 1.45; preisFeld[1] = 0.85; preisFeld[2] = 0.75;
anzahlFeld[3]:
| Index 0 | 2 |
| Index 1 | 7 |
| Index 2 | 3 |
preisFeld[3]:
| Index 0 | 1.45 |
| Index 1 | 0.85 |
| Index 2 | 0.75 |
Arrays können direkt bei der Deklaration mit Werten befüllt werden:
// Vollständige Initialisierung int anzahlFeld[3] = {2, 7, 3}; double preisFeld[3] = {1.45, 0.85, 0.75}; // Teilweise Initialisierung (Rest wird mit 0 gefüllt) int zahlen[5] = {1, 2}; // {1, 2, 0, 0, 0} // Größe automatisch ermitteln int werte[] = {10, 20, 30, 40}; // Größe = 4
Beispiel: feld_aus.c - Array-Ausgabe mit for-Schleife
#include <stdio.h> int main() { int anzahlFeld[3] = {2, 7, 3}; double preisFeld[3] = {1.45, 0.85, 0.75}; int index; printf("Nr.\tAnzahl\tPreis\n"); printf("---\t------\t-----\n"); for(index = 0; index < 3; index++) { printf("%d\t%d\t%.2lf\n", index+1, anzahlFeld[index], preisFeld[index]); } return 0; }
Nr. Anzahl Preis --- ------ ----- 1 2 1.45 2 7 0.85 3 3 0.75
Beispiel: feld_ein.c - Daten vom Benutzer in Arrays einlesen
#include <stdio.h> int main() { int anzahlFeld[3]; double preisFeld[3]; int index; /* Eingabe */ for(index = 0; index < 3; index++) { printf("Artikel %d, Anzahl: ", index+1); scanf("%d", &anzahlFeld[index]); printf("Artikel %d, Preis: ", index+1); scanf("%lf", &preisFeld[index]); } /* Einfache Ausgabe */ for(index = 0; index < 3; index++) printf("%3d %.2f\n", anzahlFeld[index], preisFeld[index]); return 0; }
Strings sind Zeichenketten - Texte, die aus mehreren Zeichen bestehen.
Beispiele: "Hallo", "HTW Berlin", "Programmierung in C"
Strings werden als Arrays vom Typ char gespeichert:
char bezeichnung[30]; // String mit maximal 29 Zeichen (+ '\0')
Jeder String muss mit '\0' enden!
Dieses Zeichen markiert das Ende des Strings.
Bei einem Array der Größe 30 können Sie maximal 29 Zeichen speichern,
da ein Platz für '\0' reserviert ist.
| Index | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| Zeichen | 'H' | 'a' | 'l' | 'l' | 'o' | '\0' |
Es gibt verschiedene Möglichkeiten, Strings zu initialisieren:
// Methode 1: String-Literal char text1[] = "Hallo"; // Größe automatisch (6 Zeichen inkl. '\0') // Methode 2: Mit fester Größe char text2[30] = "Hallo"; // Rest wird mit '\0' gefüllt // Methode 3: Zeichen für Zeichen char text3[] = {'H', 'a', 'l', 'l', 'o', '\0'}; // '\0' nicht vergessen!
Beispiel: text_ein.c - String vom Benutzer einlesen
#include <stdio.h> int main() { char bezeichnung[30]; /* Eingabe */ printf("Bezeichnung eingeben: "); scanf("%s", bezeichnung); // KEIN &-Operator! /* Ausgabe */ printf("Bezeichnung: %s\n", bezeichnung); return 0; }
Für String-Operationen benötigen Sie: #include <string.h>
| Funktion | Beschreibung |
|---|---|
| strlen(s) | Gibt die Länge des Strings zurück |
| strcpy(ziel, quelle) | Kopiert einen String |
| strcat(ziel, quelle) | Hängt einen String an einen anderen an |
| strcmp(s1, s2) | Vergleicht zwei Strings |
⚠️ Wichtig: Sie können Strings NICHT mit = zuweisen oder mit == vergleichen!
Verwenden Sie stattdessen strcpy() und strcmp().
#include <stdio.h> #include <string.h> int main() { char text[] = "Hallo Welt"; int laenge; laenge = strlen(text); // Gibt 10 zurück printf("Der Text '%s' hat %d Zeichen.\n", text, laenge); return 0; }
#include <stdio.h> #include <string.h> int main() { char quelle[] = "HTW Berlin"; char ziel[30]; /* String kopieren */ strcpy(ziel, quelle); printf("Quelle: %s\n", quelle); printf("Ziel: %s\n", ziel); return 0; }
❌ FALSCH:
ziel = quelle; // Funktioniert NICHT!
✅ RICHTIG:
strcpy(ziel, quelle); // Korrekt!
💡 Wichtig: Das Ziel-Array muss groß genug sein!
#include <stdio.h> #include <string.h> int main() { char text1[50] = "Hallo "; char text2[] = "Welt"; /* text2 an text1 anhängen */ strcat(text1, text2); printf("Ergebnis: %s\n", text1); // "Hallo Welt" return 0; }
#include <stdio.h> #include <string.h> int main() { char text1[] = "Apfel"; char text2[] = "Banane"; int ergebnis; ergebnis = strcmp(text1, text2); if(ergebnis == 0) printf("Strings sind gleich\n"); else if(ergebnis < 0) printf("'%s' kommt vor '%s'\n", text1, text2); else printf("'%s' kommt nach '%s'\n", text1, text2); return 0; }
| Rückgabe | Bedeutung |
|---|---|
| 0 | Strings sind identisch |
| < 0 | text1 kommt vor text2 (alphabetisch) |
| > 0 | text1 kommt nach text2 (alphabetisch) |
Arrays können auch mehrdimensional sein.
Ein 2D-Array ist wie eine Tabelle mit Zeilen und Spalten.
// 2D-Array für mehrere Strings char bezeichnungFeld[3][30]; // 3 Strings, jeder mit maximal 29 Zeichen
| Index | String (bis zu 30 Zeichen) |
|---|---|
| 0 | bezeichnungFeld[0] → "Mango" |
| 1 | bezeichnungFeld[1] → "Kiwi" |
| 2 | bezeichnungFeld[2] → "Orange" |
Beispiel: text_feld.c - Mehrere Strings speichern
#include <stdio.h> int main() { char bezeichnungFeld[3][30]; int index; /* Eingabe */ for(index = 0; index < 3; index++) { printf("Artikel %d, Bezeichnung: ", index+1); scanf("%s", bezeichnungFeld[index]); } /* Einfache Ausgabe */ for(index = 0; index < 3; index++) printf("%s\n", bezeichnungFeld[index]); return 0; }
2D-Array für mehrere Namen (Strings)
#include <stdio.h> int main() { char namen[3][20]; // 3 Namen, jeder max. 19 Zeichen int i; /* Namen eingeben */ for(i = 0; i < 3; i++) { printf("Name %d: ", i+1); scanf("%s", namen[i]); } /* Namen ausgeben */ printf("\nGespeicherte Namen:\n"); for(i = 0; i < 3; i++) { printf("%d. %s\n", i+1, namen[i]); } return 0; }
Name 1: Anna Name 2: Bob Name 3: Clara Gespeicherte Namen: 1. Anna 2. Bob 3. Clara
Mit Formatierungszeichen können Sie die Ausgabe präzise steuern:
| Format | Bedeutung | Beispiel |
|---|---|---|
| %s | String normal | "Hallo" |
| %15s | Rechtsbündig, 15 Zeichen | " Hallo" |
| %-15s | Linksbündig, 15 Zeichen | "Hallo " |
| %.5s | Maximal 5 Zeichen | "Hallo" → "Hallo" |
printf("%-15s %6d %.2f\n", name, anzahl, preis); // name linksbündig (15 Zeichen) // anzahl rechtsbündig (6 Stellen) // preis mit 2 Nachkommastellen
❌ FALSCH:
char text[30]; text = "Hallo"; // Funktioniert NICHT!
✅ RICHTIG:
char text[30]; strcpy(text, "Hallo"); // Richtig!
❌ FALSCH:
if(text1 == text2) // Falsch!
✅ RICHTIG:
if(strcmp(text1, text2) == 0) // Richtig!
❌ FALSCH:
char text[] = {'H', 'i'}; // Kein '\0'!
✅ RICHTIG:
char text[] = {'H', 'i', '\0'}; // Richtig!
❌ FALSCH:
char text[5]; strcpy(text, "Hallo Welt"); // Zu klein!
✅ RICHTIG:
char text[20]; strcpy(text, "Hallo Welt"); // Genug Platz!
💡 Tipp: Immer genügend Platz reservieren + Sicherheitspuffer einplanen!
Problem mit scanf("%s"): Liest nur bis zum ersten Leerzeichen
Lösung: Verwenden Sie fgets() für Strings mit Leerzeichen!
#include <stdio.h> int main() { char name[50]; printf("Geben Sie Ihren Namen ein: "); fgets(name, 50, stdin); // Sicher! printf("Hallo, %s", name); return 0; }
Wie funktioniert strlen() intern?
#include <stdio.h> int main() { char text[] = "HTW Berlin"; int laenge = 0; int i = 0; /* Zähle Zeichen bis '\0' */ while(text[i] != '\0') { laenge++; i++; } printf("Der String '%s' hat %d Zeichen.\n", text, laenge); return 0; }
💡 Erklärung: Die Schleife läuft, bis das Nullzeichen '\0' gefunden wird.
Jedes Zeichen davor wird gezählt.
Wie funktioniert strcpy() intern?
#include <stdio.h> int main() { char quelle[] = "Hallo"; char ziel[20]; int i = 0; /* Kopiere Zeichen für Zeichen */ while(quelle[i] != '\0') { ziel[i] = quelle[i]; i++; } ziel[i] = '\0'; // Nullzeichen nicht vergessen! printf("Quelle: %s\n", quelle); printf("Ziel: %s\n", ziel); return 0; }
⚠️ Wichtig: Das Nullzeichen '\0' muss manuell kopiert werden!
#include <stdio.h> int main() { char text[] = "HTW Berlin"; char suchZeichen = 'e'; int gefunden = 0; int i; /* Suche Zeichen */ for(i = 0; text[i] != '\0'; i++) { if(text[i] == suchZeichen) { printf("'%c' gefunden an Position %d\n", suchZeichen, i); gefunden = 1; } } if(!gefunden) printf("'%c' nicht gefunden.\n", suchZeichen); return 0; }
Verwenden Sie <ctype.h> für Zeichenumwandlung:
#include <stdio.h> #include <ctype.h> int main() { char text[] = "HtW BeRLin"; int i; printf("Original: %s\n", text); /* In Großbuchstaben umwandeln */ for(i = 0; text[i] != '\0'; i++) text[i] = toupper(text[i]); printf("Groß: %s\n", text); /* In Kleinbuchstaben umwandeln */ for(i = 0; text[i] != '\0'; i++) text[i] = tolower(text[i]); printf("Klein: %s\n", text); return 0; }
Original: HtW BeRLin Groß: HTW BERLIN Klein: htw berlin
#include <stdio.h> #include <string.h> int main() { char namen[4][20] = {"Zebra", "Apfel", "Mango", "Banane"}; char temp[20]; int i, j; /* Bubble Sort */ for(i = 0; i < 3; i++) { for(j = 0; j < 3-i; j++) { if(strcmp(namen[j], namen[j+1]) > 0) { /* Tausche namen[j] und namen[j+1] */ strcpy(temp, namen[j]); strcpy(namen[j], namen[j+1]); strcpy(namen[j+1], temp); } } } /* Ausgabe */ printf("Sortiert:\n"); for(i = 0; i < 4; i++) printf("%s\n", namen[i]); return 0; }
char text[50]; int zahl = 42; sprintf(text, "Die Zahl ist: %d", zahl); printf("%s\n", text); // "Die Zahl ist: 42"
char text[] = "42 3.14"; int ganzzahl; double kommazahl; sscanf(text, "%d %lf", &ganzzahl, &kommazahl); printf("Int: %d, Double: %.2f\n", ganzzahl, kommazahl);
💡 Nützlich für: Datenkonvertierung, Parsing, String-Formatierung
| Funktion | Beschreibung |
|---|---|
| strncpy(d, s, n) | Kopiert maximal n Zeichen (sicherer als strcpy) |
| strncat(d, s, n) | Hängt maximal n Zeichen an |
| strncmp(s1, s2, n) | Vergleicht die ersten n Zeichen |
| strchr(s, c) | Sucht Zeichen c in String s |
| strstr(s1, s2) | Sucht String s2 in String s1 |
| strtok(s, delim) | Teilt String an Trennzeichen auf |
💡 Tipp: Die "n"-Varianten (strncpy, strncat, strncmp) sind sicherer,
da Sie eine maximale Länge angeben können.
#include <stdio.h> #include <ctype.h> int main() { char text[] = "HTW Berlin ist super"; int woerter = 0; int inWort = 0; int i; for(i = 0; text[i] != '\0'; i++) { if(isspace(text[i])) // Leerzeichen? { inWort = 0; } else if(!inWort) { inWort = 1; woerter++; } } printf("Der Text enthält %d Wörter.\n", woerter); return 0; }
💡 Wichtigste Regel: In C können Sie Strings NICHT mit = und == verwenden!
Nutzen Sie immer die String-Funktionen!