Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/StringArraySortieren: Unterschied zwischen den Versionen

(Hinweis auf stdlib-Funktionen dazu)
 
(kein Unterschied)

Aktuelle Version vom 5. März 2013, 17:37 Uhr

Ziel

In dieser Aufgabe sollst du dich mit der Übergabe von Kommandozeilenparametern an C-Programme sowie dem Speicherzugriff mittels Zeigern vertraut machen. Dazu soll ein Programm entwickelt werden, das die übergebenen Kommandozeilenparameter lexikographisch sortiert ausgibt. Implementiere die notwendigen Hilfsfunktionen ohne Verwendung der entsprechenden Funktionen aus der stdlib (memcpy, strcmp und qsort).

Array ausgeben

Die main()-Funktion eines C-Programms hat zwei Parameter: der erste (int argc) gibt die Anzahl der Kommandozeilenparameter an, der zweite (char *argv[]) zeigt auf ein Array von Strings (also char-Pointer) mit den einzelnen, durch Leerzeichen getrennten Kommandozeilenparametern.

Schreibe ein Programm, das alle angegebenen Kommandozeilenparameter zeilenweise ausgibt. Warum wird immer ein "Parameter" mehr ausgegeben?

Speicher kopieren

Bevor wir das argv-Array sortieren können, müssen wir es kopieren, da auf einigen Systemen der Speicher des Arrays geschützt ist. Schreibe dazu eine Funktion

 void mem_copy(char *destination, char *source, int length) {
     ...
 }

welche die angegebene Anzahl von Bytes (=Zeichen) von source nach destination kopiert.

Tipp: Mit dem Ausdruck *ptr++ kannst du auf das Ziel eines Pointers ptr zugreifen und den Pointer gleich danach erhöhen.

Passe nun dein Programm so an, dass via malloc() ausreichend Speicher für eine Kopie des argv-Arrays angefordert wird, es dann mit mem_copy() dorthin kopiert wird und zuletzt diese Kopie ausgegeben wird.

Strings vergleichen

Bevor wir das ganze Array sortieren können, benötigen wir zuerst eine Funktion zum Vergleich zweier Strings miteinander:

 int str_compare(char *a, char *b) {
     ...
 }

Die Funktion soll den Wert 0 zurückgeben, falls beide Strings gleich sind, einen negativen Wert, wenn a lexikographisch kleiner als b ist oder einen positiven Wert, falls a lexikographisch größer als b ist.

Tipp: Für einzelne Zeichen entspricht der Rückgabewert genau der Differenz dieser Zeichen.

Array sortieren

Nun kannst du die Funktion zum Sortieren implementieren:

 void sort(char **list, int length) {
     ...
 }

Ein einfacher, für unser Beispiel ausreichender Sortieralgorithmus ist Bubblesort.

Viel Spaß!

Kommentare

Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf "bearbeiten" und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)