Zeichenketten (Strings) in C
|
|
|
- Hannah Egger
- vor 9 Jahren
- Abrufe
Transkript
1 Zeichenketten (Strings) in C Jörn Loviscach Versionsstand: 7. Oktober 2011, 11:27 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Germany License. To view a copy of this license, visit or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA. 1 Grundlagen Zeichenketten [Strings] werden in C als Arrays von char gespeichert. Statt dass man die Länge der Zeichenkette speichert, setzt man hinter das letzte Zeichen den Wert 0: null-terminated string. Mann könnte eine solche Zeichenkette im Prinzip so bauen: 1 Oder anschaulicher: 2 Oder in der dann üblichen Form: 3 Die doppelten Anführungszeichen sagen dem Compiler, dass er eine Zeichenkette erzeugen soll und zwar mit der selbstverständlichen Null am Ende, auch wenn man die in diesem Programmcode nicht sieht. Der Unterschied zwischen einfachen 1
2 2 STANDARDFUNKTIONEN FÜR STRINGS 2 und doppelten Anführungszeichen in C: 4 Achtung: In anderen Programmiersprachen können die Bedeutungen der Anführungszeichen ganz andere sein. Suchen aller Buchstaben a in einer Zeichenkette und Ersetzen durch e: 5 Demo auch mit der Speicheransicht in der Entwicklungsumgebung. Nicht die Länge des Strings zu speichern, sondern eine Null ans Ende zu setzen, sah am Anfang wie eine gute Idee aus. Heute ist man klüger. In Java und C# macht man es anders; in C++ kann und sollte man es anders machen; und auch in C gibt es inzwischen einige Funktionen, die vorsichtiger mit Zeichenketten umgehen. Das wesentliche Problem mit der Null am Ende ist, dass sie fehlen kann und dass die Zeichenkette damit in den nachfolgenden Speicher hineinzuragen scheint eine Möglichkeit für schwer zu findende Fehler und ein wesentliches Einfallstor für Buffer-Overflow-Angriffe. Wenn das lateinische Alphabet mit den üblichen Akzenten und Umlauten nicht reicht, kann man Zeichenketten statt mit char alternativ mit dem in <wchar.h> deklarierten Typ wchar_t bilden. Der hat typischerweise 16 Bit, unter Linux und Mac OS X aber 32 Bit. Achtung: wchar_t benötigt andere Funktionen zum Kopieren usw. als char. 2 Standardfunktionen für Strings In <string.h> sind einige übliche Funktionen für Zeichenketten deklariert. Demos einiger Beispiele: 2.1 Länge int n = strlen(a); liefert die Länge der Zeichenkette a, also die Zahl der Zeichen vor dem ersten Auftauchen von 0. Demo: Wenn die 0 fehlt, passiert Unsinn.
3 2 STANDARDFUNKTIONEN FÜR STRINGS 3 Von dieser Funktion gibt es eine sicherere Variante strnlen, der man eine Maximallänge mitgeben kann. 2.2 Vergleich int v = strcmp(a, b); liefert eine Zahl, die sagt, was die alphabetische Sortierung der beiden Zeichenketten a und b ist: Ist das Ergebnis negativ, steht die erste Zeichenkette im Alphabet vor der zweiten; ist das Ergebnis null, sind beide Zeichenketten gleich; ist das Ergebnis positiv, steht die erste Zeichenkette im Alphabet hinter der zweiten. Eigentlich geht es gar nicht um das Alphabet, sonder um die Sortierung in der Liste der Zeichencodes: A steht vor Z und das steht vor a. Diese Funktion ist auch ein Weg, festzustellen, ob zwei Zeichenketten gleich sind. Der Vergleich a == b funktioniert für Zeichenketten in C nicht (in moderneren Sprachen dagegen schon). Was a == b in C tatsächlich bedeutet, sehen wir demnächst bei den Zeigern. Von dieser Funktion gibt es eine sicherere Variante strncmp, der man eine Maximallänge mitgeben kann. 2.3 Kopie strcpy(a, b); kopiert die Zeichenkette b in die Zeichenkette a. Es wird nicht geprüft, ob a dafür groß genug ist, was gefährlich ist. Die etwas sicherere Variante dieser Funktion ist strncpy. Wenn die zu kopierende Zeichenkette zu lang ist, fehlt der Kopie aber die abschließende Null. Diese Funktionen sind ein Weg, eine Zeichenkette einer anderen zuzuweisen. Mit a = b geht das in C nicht, weil man nicht komplett ein Array einem anderen zuweisen kann. 2.4 Aneinanderhängen strcat(a, b); kopiert die Zeichenkette b hinter die Zeichenkette a, so dass beide hintereinanderhängen. Es wird nicht geprüft, ob a dafür noch Platz hat, was gefährlich ist. Eine sicherere Variante dieser Funktion ist strncat, der man eine Maximalzahl anzuhängener Zeichen mitgeben kann (nicht die Gesamtlänge!). Diese Funktion sorgt für in jedem Fall für eine abschließende Null. Diese kommt im Zweifelsfall zu der angegeben Maximalzahl anzuhängender Zeichen hinzu. Was ist hieran auf verborgene Weise falsch? char a[] = "Donner"; char b[] = "wetter"; strcat(a, b); // Verborgener Fehler! In vielen anderen Sprachen kann man a + b schreiben, um zwei Zeichenketten aneinanderzuhängen.
4 3 AUSGABE UND UMWANDLUNG 4 3 Ausgabe und Umwandlung Die übliche Funktion, Zeichenketten auszugeben, ist puts, analog zur Ausgabe einzelner Zeichen mit putchar. Beides ist wesentlich schlanker als die übliche Funktion zur Ausgabe in C: printf. Damit diese Funktion überhaupt in den Programmspeicher des MSP430G2231 passt, muss man sie zurechtstutzen: Options > General Options > Library Options > Printf formatter: Tiny. printf nimmt als erstes Argument eine Formatbeschreibung deshalb das f im Namen und dann beliebig viele Argumente, die in die Platzhalter des Formats eingesetzt werden sollen. Die Zahl der Argumente ist in dieser Funktion also nicht fest! Beispiel: 6 Hier sind einige Platzhalter: %d dezimale Ausgabe eines int %x hexadezimale Ausgabe eines unsigned int %c Ausgabe eines Zeichens char %s Ausgabe einer C-Zeichenkette %% Ausgabe des Prozentzeichens In der Tiny -Variante ist die printf-funktion so eigenschränkt, dass man kaum mehr tun kann. Eigentlich gehen sonst auch long und double. Ebenso kann man mit weiteren Buchstaben und Zahlen nach dem Prozentzeichen zum Beispiel einstellen, wie weit die Ausgabe mit Leerzeichen links aufgefüllt werden soll, um immer eine Mindestbreite zu haben. Die Zahl 1234 ist etwas Anderes als die Zeichenkette "1234": Die Zahl passt in eine int-variable, die Zeichenkette verlangt dagegen Bytes. Mit der Zahl kann man Summen usw. bilden, mit der Zeichenkette nicht. Also sind Funktionen nötig, um Zahlen in Zeichenketten zu verwandeln und umgekehrt. In <stdlib.h> ist dazu zum Beispiel atoi deklariert ( ASCII to Integer ). Diese Funktion nimmt eine Zeichenkette und versucht, am Anfang davon eine ganze Zahl zu erkennen und die als Ergebnis zurückzuliefern. Wenn das nicht gelingt, wird als Ergebnis null zurückgeliefert. So kann man allerdings das Fehlschlagen nicht von der Eingabe einer Null unterscheiden. Diese Funktion gilt deshalb als überholt. 7
5 3 AUSGABE UND UMWANDLUNG 5 Die umgekehrte Funktion itoa ( Integer to ASCII ) ist nicht Teil des Standards, auch wenn sie auf einigen System existiert. Mit Hilfe der Aufgaben von Seminarzettel 6 kann man itoa leicht selbst entwickeln. Eine schwergewichtige Alternative ist, printf in eine Zeichenkette umzuleiten. Das macht die ebenfalls in <stdio.h> deklarierte Funktion sprintf. Ihr erstes Argument ist die Zeichenkette (später genauer: die Adresse der Zeichenkette), in die gedruckt werden soll. Diese Funktion prüft allerdings wieder einmal nicht, ob die angegebene Zeichenkette genug Platz hat. Beispiel für die Verwendung: char a[16]; int x = 234; sprintf(a, "Wert: %d", x); Vorsicht auch allgemein bei den Funktionen, die mit Zeichenketten umgehen: Es muss in der Zeichenkette nicht nur Platz für die eigentlichen Zeichen sein, sondern auch für die abschließende Null.
9 Zeiger (Pointer). Dynamischer Speicher
9 Zeiger (Pointer). Dynamischer Speicher Jörn Loviscach Versionsstand: 25. September 2013, 18:07 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html
10 Die Programmiersprache C99: Zusammenfassung
10 Die Programmiersprache C99: Zusammenfassung Jörn Loviscach Versionsstand: 25. September 2014, 18:40 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html
22 Fehlerfortpflanzung und Extrema bei Funktionen mehrerer Veränderlicher
22 Fehlerfortpflanzung und Extrema bei Funktionen mehrerer Veränderlicher Jörn Loviscach Versionsstand: 21. März 2014, 21:11 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der
8 Relationen, Umkehrung
8 Relationen, Umkehrung Jörn Loviscach Versionsstand: 29. September 2012, 19:37 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This
1 Begriff Kombinatorik; Zahl aller Teilmengen
6 Kombinatorik Jörn Loviscach Versionsstand: 2. Dezember 2011, 16:25 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.j3l7h.de/videos.html This work
17 Grundrechenarten für komplexe Zahlen
7 Grundrechenarten für komplexe Zahlen Jörn Loviscach Versionsstand: 2. September 203, 5:58 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html
2 Geradengleichungen in Parameterform. Länge und Skalarprodukt
2 Geradengleichungen in Parameterform. Länge und Skalarprodukt Jörn Loviscach Versionsstand: 19. März 2011, 15:33 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu:
1 Äquivalenzumformungen, Lösungsmenge
5 Ungleichungen Jörn Loviscach Versionsstand: 21. September 2013, 15:55 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This work is
27 Zufallsvariablen. Erwartungswert. Median. Perzentilen
27 Zufallsvariablen. Erwartungswert. Median. Perzentilen Jörn Loviscach Versionsstand: 7. Januar 2011, 21:03 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu:
29 Schätzung von Erwartungswert und Varianz
29 Schätzung von Erwartungswert und Varianz Jörn Loviscach Versionsstand: 21. September 2013, 15:55 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html
19 Folgen. Grenzwerte. Stetigkeit
19 Folgen. Grenzwerte. Stetigkeit Jörn Loviscach Versionsstand: 27. Dezember 2014, 16:35 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html
Potenzen und Wurzeln komplexer Zahlen. Eulersche Identität. Polardarstellung. Additionstheoreme. Vollständige Faktorisierung von Polynomen
Potenzen und Wurzeln komplexer Zahlen. Eulersche Identität. Polardarstellung. Additionstheoreme. Vollständige Faktorisierung von Polynomen Jörn Loviscach Versionsstand: 3. Dezember 200, 20:42 Die nummerierten
27 Zufallsvariablen. Erwartungswert. Median. Perzentilen
27 Zufallsvariablen. Erwartungswert. Median. Perzentilen Jörn Loviscach Versionsstand: 21. September 2013, 15:56 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html
15 Restabschätzung nach Taylor. Potenzreihen
15 Restabschätzung nach Taylor. Potenzreihen Jörn Loviscach Versionsstand: 21. März 2014, 21:09 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html
25 Elementare Längen, Flächen und Volumina. Bogenlänge. Rotationskörper
25 Elementare Längen, Flächen und Volumina. Bogenlänge. Rotationskörper Jörn Loviscach Versionsstand: 29. September 2012, 19:49 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen
Die nummerierten Felder bitte mithilfe der Videos ausfüllen:
5 Koordinatensysteme Zoltán Zomotor Versionsstand: 6. August 2015, 21:43 Die nummerierten Felder bitte mithilfe der Videos ausfüllen: http://www.z5z6.de This work is based on the works of Jörn Loviscach
3 Klassen, Attribute, Methoden
3 Klassen, Attribute, Methoden Jörn Loviscach Versionsstand: 10. April 2011, 10:25 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.j3l7h.de/videos.html
16 Trigonometrie: Sinus und Freunde, Arcusfunktionen
6 Trigonometrie: Sinus und Freunde, Arcusfunktionen Jörn Loviscach Versionsstand: 2. Dezember 20, 6:28 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.j3l7h.de/videos.html
14 Partialbruchzerlegung
14 Partialbruchzerlegung Jörn Loviscach Versionsstand: 21. September 2013, 15:59 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This
24 Mehrdimensionale Integrale
24 Mehrdimensionale Integrale Jörn Loviscach Versionsstand: 20. März 2012, 16:00 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.j3l7h.de/videos.html
Die Programmiersprache C99: Zusammenfassung
Die Programmiersprache C99: Zusammenfassung Jörn Loviscach Versionsstand: 7. Dezember 2010, 19:30 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.youtube.com/joernloviscach
22 Lineare Näherung. Anwendungen
22 Lineare Näherung. Anwendungen Jörn Loviscach Versionsstand: 21. September 2013, 15:57 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html
Exponentialfunktionen, Eulersche Zahl, Logarithmen
Exponentialfunktionen, Eulersche Zahl, Logarithmen Jörn Loviscach Versionsstand: 22. Oktober 2010, 23:29 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.youtube.com/joernloviscach
23 Integral. 1 Idee des Integrals
23 Integral Jörn Loviscach Versionsstand: 21. September 2013, 15:56 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This work is licensed
4 Zahlenbereiche. 1 Natürliche, ganze und rationale Zahlen
4 Zahlenbereiche Jörn Loviscach Versionsstand: 21. September 2013, 15:53 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This work
In den USA verwendet man statt dessen eckige Klammern, was sich in der Software niederschlägt (mit Ausnahmen wie Wolfram Alpha):
3 Matrizen Jörn Loviscach Versionsstand: 20. März 2012, 16:02 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.j3l7h.de/videos.html This work is licensed
Arrays (Felder/Vektoren)
Arrays (Felder/Vektoren) Zusammenfassung mehrerer Variablen des gleichen Typs unter einem Namen im Speicher direkt hintereinander abgelegt Definition: Typname Arrayname [Größe]; Beispiel: int ar [5]; Zugriff
In den USA verwendet man statt dessen eckige Klammern, was sich in der Software niederschlägt (mit Ausnahmen wie Wolfram Alpha):
3 Matrizen Jörn Loviscach Versionsstand: 28. März 2015, 21:32 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This work is licensed
3 Mengen, Logik. 1 Naive Mengenlehre
3 Mengen, Logik Jörn Loviscach Versionsstand: 21. September 2013, 15:53 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This work is
Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny
Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny 9. Zeiger Arbeitsspeicher / Adressen Der Arbeitsspeicher des Computers (RAM) besteht aus einem Feld von Speicherzellen, beginnend bei Adresse
GI Vektoren
Vektoren Problem: Beispiel: viele Variablen vom gleichen Typ abspeichern Text ( = viele char-variablen), Ergebnisse einer Meßreihe ( = viele int-variablen) hierfür: Vektoren ( = Arrays = Feld ) = Ansammlung
18 Kontinuierliche Fourier-Transformation. Laplace-Transformation
18 Kontinuierliche Fourier-Transformation. Laplace-Transformation Jörn Loviscach Versionsstand: 28. März 2015, 21:30 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos:
14 Schmiegeparabel und Freunde, Taylor-Reihe
14 Schmiegeparabel und Freunde, Taylor-Reihe Jörn Loviscach Versionsstand: 20. März 2012, 16:01 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.j3l7h.de/videos.html
Zeichenketten. Peter Sobe
Zeichenketten existieren in C nicht als eigener Typ. Es können nur Zeichenkettenkonstante z.b. zur Ausgabe benutzt werden. Beispiel: printf( Guten Tag!\n ); Eine Zeichenkette als Variable kann aber in
8 Design Patterns. Events
8 Design Patterns. Events Jörn Loviscach Versionsstand: 28. März 2015, 19:13 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This work
Zeichenketten (1) Literale von Zeichenketten werden in doppelte Anführungszeichen gesetzt
Zeichenketten (1) Literale Literale von Zeichenketten werden in doppelte Anführungszeichen gesetzt "Hallo Welt" Mehrere solcher Literale gelten als eine Zeichenkette, wenn sie nur durch Whitespaces (Leerzeichen,
5 Determinante, Spatprodukt, Vektorprodukt, inverse Matrix
5 Determinante, Spatprodukt, Vektorprodukt, inverse Matrix Jörn Loviscach Versionsstand: 20. März 2012, 16:02 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu:
2 Grundlagen zu Ableitung und Integral
2 Grundlagen zu Ableitung und Integral Jörn Loviscach Versionsstand: 21. September 2013, 15:52 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html
6 Vektoranalysis Kurven
6 Vektoranalysis Kurven Zoltán Zomotor Versionsstand: 31. Juli 2014, 13:51 Die nummerierten Felder bitte mithilfe der Videos ausfüllen: http://www.z5z6.de This work is based on the works of Jörn Loviscach
6. Bearbeitung von Strings in C Bearbeitung von Strings in C
Bearbeitung von Strings in C 6-1 Definition des String: 6. Bearbeitung von Strings in C Zeichenstrings werden als Felder von Zeichen abgespeichert: char [ ] ; Wie die Daten (Zeichenfolge)
Zeichenketten (Strings)
Zeichenketten (Strings) Programme verarbeiten neben numerischen Daten oft auch Daten in Textform. Texte sind Zeichenketten, die auch als Strings bezeichnet werden In C gibt es keinen eigenständigen Datentyp
Programmiersprachen Einführung in C
Programmiersprachen Einführung in C Teil 4: Prof. Dr. Jörg Schwenk Lehrstuhl für Netz- und Datensicherheit Gliederung Programmiersprachen 1. Von der Maschinensprache zu C 2. Die Struktur von C-Programmen
Schleifen und Arrays Javakurs
Schleifen und Arrays Javakurs Sebastian Dyroff Robert Buchholz freitagsrunde.org/javakurs 24. März 2009 Was ist das Problem? System.out.println(5); System.out.println(4); System.out.println(3); System.out.println(2);
Dynamischer Speicher
Dynamischer Speicher C-Kurs 2012, 3. Vorlesung Tino Kutschbach [email protected] http://wiki.freitagsrunde.org 13. September 2012 This work is licensed under the Creative Commons Attribution-ShareAlike
C-Kurs 2011: Arrays, Strings, Pointer
C-Kurs 2011: Arrays, Strings, Pointer [email protected] 15. September 2011 v3.0.33 This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 License. Ohne Pointer geht nichts. 2 Pointer
3 Klassen, Attribute, Methoden
3 Klassen, Attribute, Methoden Jörn Loviscach Versionsstand: 21. März 2014, 22:58 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This
Grundlagen der Programmierung in C++ Arrays und Strings, Teil 1
Grundlagen der Programmierung in C++ Arrays und Strings, Teil 1 Wintersemester 2005/2006 G. Zachmann Clausthal University, Germany [email protected] Das C++ Typsystem simple structured integral enum
7 Dateien und Datenströme (Streams)
7 Dateien und Datenströme (Streams) Jörn Loviscach Versionsstand: 21. März 2014, 22:57 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html
Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel
4213 Variablen 17.834 float Flugzeug 36812736294 I write code Hund long String Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel 3 + 4 1 Variablen sind wie Becher. Sie speichern etwas. // Variablen
