Hallo Thorsten, * Thorsten Haude schrieb am 03.Aug.2002:
* Jan Trippler
[02-08-02 22:04]: On Fre, 02 Aug 2002 at 20:52 (+0200), Thorsten Haude wrote:
Du hast bei einem strncmp() _immer_ den zusätzlichen Aufwand, die String-Länge prüfen, bestimmen, übergeben zu müssen.
Nein, gewöhnlich haben Strings eine #definierte maximale Länge, die man dann auch nett in strncmp() benutzen kann.
Gewöhnlich haben _statisch_ deklarierte Strings eine definierte maximale Länge - was ist mit dynamisch erzeugten (Stichwort malloc)?
An welchen Programmen hast Du bisher gearbeitet?
Was ist, wenn man z.B eine Zeile einer Datei oder der Standardeingabe einliest? So eine Zeile ist normalerweise max. 80 Zeichen lang, kann aber sehr, sehr viel länger sein. Wenn es eine Datei von 2GB ist und sie kein \n enthält, dann ist diese eine Zeile verdammt lang. Wo willst Du da die Grenze legen?
Kann man die #definierte Länge wohl auch dazu benutzen, einen String zu allozieren? Wenn nein, warum nicht?
Wenn ich eine feste Länge habe, warum sollte ich dann noch dynamisch allozieren? Dann kann ich doch genausogut statisch deklarieren. Ist dann besser. Einzige Ausnahme, ich weiß nicht wie oft ein String vorkommt. Aber, daß ich nicht weiß wie lang ein String ist, halte ich für Wahrscheinlicher.
Und auch bei statischen Strings musst Du rechnen, nämlich dann, wenn die Definitionen zweier Strings sich unterscheiden. Dann musst Du nämlich feststellen, welche der beiden Längen Du nimmst.
min(len1, len2)
Schon flahsc. Dann wäre foo und foobar gleich, da nur die ersten drei Zeichen, die Länge von foo, verglichen wird. Ok, wenn Du noch eins hinzuaddierst, dann funktioniert es. Aber was ist das für einen Aufwand? Wenn es nur ein einziger, oder wenige Vergleiche sind, so ist das sicherlich egal. Aber gerade Vergleiche können sehr, sehr häufig vorkommen. Denk mal an Sortierprogramme.
Das willst du alles hart kodiert in das Programm schreiben? Wie flexibel und gut wartbar ;-)
Dafür gibt's #defines.
Der Wert wird beim Compelieren festgelegt. Was ist, wenn ein und die Gleiche Funktion von verschiedene Programmteile benutzt wird, die ganz unterschiedliche Längen haben? Oder wenn Du nur die Funktion schreibst, und kein vollständiges Programm. Etwa einen neuen Sortieralgorithmus. Dann weißt Du doch nicht, wofür dieser Algorithums benutzt wird. Der eine benutzt es für ganz kurze Worte, der andere für Ellenlange Strings. Mit #DEFINES könntest Du zwar was machen, aber zum einen funktioniert es nicht, wenn ein und das gleiche Programm ganz verschieden lange Stringpaare miteinander vergleichen will. Sagen wir mal, zum einen Wörter, und zum anderen kB-Große Strings. Da kann man doch nicht zur Sicherheit einfach mal 1MB vorgeben.
Der Code wird im Gegenteil dann leichter lesbar sein, wenn sich der Leser nicht auch noch darüber Gedanken machen muß, ob mal wieder eine Funktion aus string.h aus dem Ruder läuft.
Diese Begründung ist ja nun absoluter Quatsch, sorry! Woher soll denn Dein Leser wissen, dass nicht strncmp() aus dem Ruder läuft?
Sinnvollerweise benutzt man für das n den gleichen Wert, der für die Allozierung des Strings benutzt worden ist. Dieser Wert hat dann noch einen brauchbaren Namen wie MAX_PATH_LEN, dann kann man das schon erkennen.
Was aber, wenn er ständig anders ist, und man ihm kompliziert ermitteln müßte? Etwas die Zeilenlänge innerhalb einer Datei? Bernd -- Was ist quoten? Quoten ist das Zitieren aus einer mail, der man antwortet. Und wie macht man es richtig? Zitate werden mit "> " gekennzeichnet. Nicht mehr als nötig zitieren. Vor den Abschnitten das Zitat, auf das man sich bezieht, mit einer Zeile Abstand oben und unten. |Zufallssignatur 12