Hallo und willkommen zurück. In dieser
Vorlesung möchte ich über das Erstellen einer Zeichenfolge sprechen,
insbesondere darüber, wie Sie dies in c mithilfe eines Zeichenarrays tun können.
Ich neige dazu, die Begriffe Zeichenfolge und Zeichenketten austauschbar zu verwenden.
Aber wirklich eine Zeichenkette ist das Zeichenarray, über das wir sprechen werden.
Es ist ein sehr wichtiges Konzept.
Wir werden jetzt in der Lage sein, Wörter und Text in unserem Programm zu verwenden, um alle möglichen Dinge zu tun.
Jetzt hat c selbst keinen Datentyp, der eine Zeichenfolge darstellt.
Da ist nichts. Viele Sprachen unterstützen entweder
ein Objekt oder einen Datentyp vom Typ string.
Da die Zeichenfolge keinen Datentyp c enthält, können Sie keinen
der Operatoren für die Zeichenfolge verwenden.
Am Ende werden wir also die Standardbibliothek verwenden und es gibt alle möglichen
Zeichenfolgenfunktionen, über die wir sprechen werden.
Wir haben drei Vorträge, die den verschiedenen Zeichenfolgenfunktionen gewidmet sind, die Sie verwenden können.
Dies hilft uns, die Zeichenfolgen zu manipulieren und Informationen über die Zeichenfolgen zu erhalten.
Sie können jedoch keine Operatoren für Zeichenfolgen verwenden, keine
Plus- oder Minuszeichenfolgen, nichts dergleichen.
Zeichenfolgen in c werden in einem Array vom Typ char gespeichert.
Wir wissen, was ein Array ist. Wir wissen, was ein Typ char ist.
Ein Typ char ist ein einzelnes Zeichen, ein Array, in dem Sie
einfach mehrere Elemente unter demselben Namen speichern können.
Es ist also sinnvoll, dass sich eine Zeichenfolge innerhalb eines Zeichenarrays befindet,
da eine Zeichenfolge aus vielen, vielen Zeichen besteht.
Zeichen einer Zeichenfolge werden also in benachbarten Speicherzellen gespeichert, ein Zeichen pro Zelle.
Sie können genauso darauf zugreifen wie auf ein Array.
Aber wie Sie tatsächlich eine Zeichenfolge deklarieren und sehen würden, würden Sie einfach den char-Typ und dann
die Klammern verwenden, um die Größe anzugeben, genau wie bei einem normalen Array, wenn
Sie es von einem anderen Typ erstellen würden.
Char und dann, wie auch immer Sie heißen, und dann die
Größe des Zeichenarrays in eckigen Klammern.
So können Sie einen String in c deklarieren.
Wenn Sie nun die Zeichenfolge in c wie folgt deklarieren,
sind keine tatsächlichen Daten zugeordnet. Sie geben nur die Größe an.
Das ist der einfachste Weg.
Die Variable kann also eine Zeichenfolge aufnehmen, die bis zu 19 Zeichen enthält.
Denken Sie an dieses Nullzeichen.
Wenn Sie sagen, dass Ihre Zeichenfolgengröße 20 sein wird, bedeutet dies, dass tatsächlich nur
19 Zeichen gespeichert werden können, da
Sie dieses eine zusätzliche Zeichen für die Null haben müssen.
Beachten Sie, dass bei der Deklaration eines Zeichenarrays von 20 Zeichen
19 Zeichen dort gespeichert werden können.
Wenn Sie die Dimension eines Arrays angeben, die Sie vor einer Zeichenfolge verwenden möchten, um eine Zeichenfolge
zu speichern, muss diese
mindestens eins größer sein als die Anzahl der Zeichen in der Zeichenfolge, die Sie speichern möchten.
Der Compiler fügt automatisch den Nullterminator am Ende jeder Zeichenfolgenkonstante hinzu.
Was Sie also wirklich tun sollten, ist, wenn
Sie diese Zeichenfolgen erstellen, sie zu initialisieren.
Sie können also eine Zeichenfolgenvariable genauso initialisieren wie ein Array.
Sie setzen jedes Zeichen in diese Klammern.
Das sieht also sehr ähnlich aus, als würden Sie Elemente in einem Integer-Array initialisieren.
Wenn Sie jedoch char word sagen und dann
in die wellenförmigen Klammern jedes einzelne Zeichen einfügen,
wird ein Zeichenarray erstellt.
Es ist also dasselbe wie bei jeder anderen Array-Initialisierung.
Wenn die Größe nicht angegeben wird, berechnet
der c-Compiler automatisch die Anzahl der Elemente im Array und fügt dann eins für den Nullterminator hinzu.
Es basiert also auf der Anzahl der Initialisierer, die Sie zwischen den Klammern und den
geschweiften Klammern haben.
Diese Anweisung reserviert Speicherplatz und Speicher für genau sieben
Zeichen, das Ausrufezeichen h-e-l-l-o und
dann den Nullterminator. Dieses kleine Diagramm auf der rechten Seite zeigt Ihnen dies.
Automatisch und Hinzufügen dieses Nullterminators. Jetzt wäre es
wirklich ein Ärgernis, wenn Sie Ihre Zeichenarrays
immer mit einfachen Anführungszeichen gefolgt von Kommas initialisieren müssten.
Was Sie also tun können, ist sogar eine Kurzschreibweise: Sie können das einfach in doppelte Anführungszeichen setzen.
Sie können also entweder die Zeichenfolge explizit angeben, wie in diesem ersten
Beispiel, und dann müssten Sie tatsächlich eine Zeichenfolgenfunktion verwenden, um
Daten darauf anzuwenden, oder
Sie können den Compiler dies für Sie tun lassen.
Das Problem dabei ist, dass Sie immer daran denken müssen, dieses zusätzliche Zeichen für
die Null hinzuzufügen.
Was Sie also wirklich tun sollten, ist, dass Sie den Compiler es für Sie herausfinden lassen.
Setzen Sie also keine Zahlen in diese Klammern für die Größe.
Denn wenn die angegebene Größe zu klein ist, kann der Compiler das abschließende Nullzeichen
am Ende des Arrays nicht anpassen und es wird kein Zeichen dort abgelegt, und es wird
Ihnen nicht mitgeteilt, dass dort kein Zeichen abgelegt wurde.
Sie werden also einen Fehler in Ihrem Programm haben, den Sie nicht einmal kennen werden.
Die beste Vorgehensweise ist, wenn Sie ein Zeichenfolgenliteral verwenden
und eine Zeichenfolge initialisieren, damit der Compiler die Größe für Sie ermittelt.
Machen Sie es größer oder so und setzen Sie es dann einfach dort ein und es wird die Größe für Sie herausfinden.
Geben Sie also nicht die Größe an. Lassen Sie den Compiler es herausfinden.
Auf diese Weise können Sie sicher sein, dass es richtig sein wird.
Lassen Sie diese Klammern einfach als leere Klammern
und weisen Sie sie dem Zuweisungsoperator zu. Anschließend können Sie
sie in doppelte Anführungszeichen setzen. Sie brauchen nicht einmal die eckigen Klammern.
Dies ist die beste Vorgehensweise. Wir werden ein Beispiel durchgehen.
Sie können auch nur einen Teil eines Arrays
von Elementen vom Typ char mit einer Zeichenfolge initialisieren.
Wenn Sie also tatsächlich eine wirklich große Größe erstellt und nur
ein paar Zeichen zugewiesen haben, ist das auch in
Ordnung. Sie initialisieren nur einige der Zeichen. Alle anderen Zeichen werden nur
leer sein.
Was hier also passieren wird, ist, dass der Compiler die ersten fünf Elemente initialisiert.
Str null bis str vier, alle
Zeichen der Zeichenfolgenkonstante und dann der Zeichenfolge unter 5
enthalten das Nullzeichen.
Es wird weiterhin Platz für alle 40 Elemente
im Array zugewiesen, aber nur fünf davon werden verwendet, vier plus das Nullzeichen.
In Ihrer Best Practice wird also keine Zahl innerhalb der Größe
angegeben, sondern nur ein Zeichenfolgenliteral mit doppelten Anführungszeichen zugewiesen.
Das wirst du am Ende sehen.
Wenn Sie nun nicht initialisiert haben und nur das Zeichenarray
mit einer Größe erstellt haben, wie setzen Sie das Datum ein?
Nun, weil es sich um ein Array handelt, können Sie nicht einfach Daten zuweisen.
Wir wissen, dass wir, wenn wir ein Integer-Array hätten, einem
Integer-Array nicht einfach die Nummer fünf zuweisen können,
es macht keinen Sinn. Sie müssen die tatsächlichen Elemente angeben.
Sie müssen die Indizes angeben.
Sie können also nicht so etwas wie ein Zeichenarray mit 100 Zeichen deklarieren und dann sagen,
dass s gleich Hallo ist. Das wird nicht funktionieren.
Weil s wiederum ein Array ist. Obwohl es sich um eine Zeichenfolge in doppelten Anführungszeichen handelt, handelt es sich immer noch um ein Array im Speicher.
Wenn Sie also eine Zuweisungsoperation ausführen, können Sie ein Array von
Zeichen nicht einem anderen Array von Zeichen wie oben zuweisen.
Wenn Sie einem Zeichenarray Daten zuweisen
möchten, nachdem Sie es deklariert und initialisiert haben, müssen Sie
eine spezielle Funktion namens str copy verwenden.
Und darüber werden wir in einem anderen Vortrag sprechen.
Bis zu diesem Zeitpunkt, wenn Sie Ihre Zeichenfolgen erstellen, werden sie Zeichenfolgenliterale sein, sie
werden in doppelten Anführungszeichen stehen und Sie werden sie niemals ändern.
Das ist also auch vollkommen richtig. Sie können tatsächlich einfach über den
Index auf diese Zeichen oder jedes Element im Array zugreifen und jedes Zeichen angeben.
Also s sub 0, s sub 1 und dann ein einzelnes Zeichen in einfache Anführungszeichen setzen.
Sie könnten es so zuweisen. Aber stellen Sie sich vor, Sie hätten eine Zeichenfolge mit 100 Bytes.
Dies wird viele Codezeilen erfordern. Also willst du das nicht tun.
Was Sie tun möchten, ist es zu initialisieren, wenn Sie
es ohne Größe deklarieren, und dann anzugeben, ob Sie
es jemals ändern möchten, wenn Sie es kopieren.
Soweit eine Zeichenfolge als Ausgabe angezeigt wird, wird diese printf-Funktion weiterhin verwendet.
Wenn Sie irgendwo in Ihrem Programm auf eine Zeichenfolge verweisen möchten, verwenden Sie
einfach den Array-Namen für sich.
Sie müssen keine Indizes angeben.
Weil Indizes innerhalb des Arrays ein einzelnes Zeichen angeben.
Wenn Sie die gesamte Zeichenfolge möchten, verwenden Sie einfach den Array-Namen.
Wenn Sie also die printf-Funktion zum Anzeigen der Ausgabe verwenden,
gehen Sie wie folgt vor. In den doppelten Anführungszeichen
würden Sie ein Prozent s als Formatbezeichner und dann nur den Namen des Zeichenarrays verwenden.
Sie behandeln es also nicht wie andere Arrays, wenn Sie darauf zugreifen möchten. Wenn Sie nur auf den Namen zugreifen möchten,
keine tatsächlichen Indizes oder Klammern.
Der Prozentsatz als Formatbezeichner dient zur Ausgabe
einer nullterminierten Zeichenfolge. Denken Sie daran, bevor wir Prozent d für
Ganzzahlen verwendet haben, können Sie Prozent c für Zeichen verwenden.
Für Zeichenfolgen verwenden Sie Prozent s, und dies sind Zeichenarrays.
Es wird eine nullterminierte Zeichenfolge erwartet.
Sie initialisieren die Zeichenfolge jedoch, wenn Sie sie ohne Größe ausgeführt haben und der Nullterminator
automatisch hinzugefügt wird oder wenn Sie sie
mit einer bestimmten Größe erstellt und hinzugefügt haben oder wenn Sie sie explizit
hinzugefügt haben, spielt dies keine Rolle. Es muss nur null terminiert werden.
Die Funktion printf geht davon aus, dass man auf den Formatbezeichner in
Prozent stößt, dass das entsprechende Argument eine Zeichenfolge ist, die durch ein Nullzeichen abgeschlossen wird.
Das erwartet es, also muss es so sein.
Um einen String einzugeben, wissen wir, wie
man mit scanf andere Datensätze über die Tastatur eingibt.
Wir werden das Gleiche für die Eingabe von Zeichenfolgen tun.
Wir werden eine scanf-Funktion verwenden. Mit der scanf-Funktion wird
es genauso sein, außer dass Sie einen anderen Formatbezeichner verwenden.
Für Zeichenfolgen verwenden Sie also ein Prozent s als Eingabe.
Und das wird für die Eingabe eines Strings verwendet.
Die andere Sache, die hier zu beachten ist, ist, dass es kein kaufmännisches Und für den Variablennamen gibt,
da es sich um ein Zeichen handelt. Denken Sie daran, wir haben erwähnt, dass Sie
nur das kaufmännische Und und die Adresse des Operators für Zeichenfolgen angeben müssen.
Der Grund dafür ist, dass es klarer wird, wenn wir über Zeiger sprechen.
Aber char input, obwohl es sich um ein
Zeichenarray handelt, ist es ein Zeiger, und scanf als zweites Argument nimmt einen Zeiger.
Und deshalb müssen Sie es nicht tun. Wenn Sie Ganzzahlen und Doppelte deklarieren, sind dies
keine Zeiger und. Wenn Sie
also Eingaben von der Tastatur mit scanf lesen möchten, erwartet das zweite Argument einen Zeiger, den
Sie an eine Adresse übergeben müssen.
Wenn Sie jetzt mit dem scanf eine
Zeichenfolge erstellen, wird der scanf nur bis zum Leerzeichen gelesen.
Wenn Sie also scanf machen und Jason eingeben, ist
Jason ein Ausbilder.
Das einzige, was in der Eingabe gespeichert wird, ist Jason. Denn sobald es dieses Leerzeichen
erreicht, wird es den Rest der Zeichenfolge nicht mehr lesen.
Es gibt also andere Funktionen, mit denen Sie die gesamte Zeichenfolge lesen können.
Einige der Beispiele, die wir verwenden werden, werden das wahrscheinlich tun. Sie können Dinge wie f get s
tun, eine andere Möglichkeit, Eingaben von der Tastatur zu lesen, und die die gesamte
Zeichenfolge unabhängig von Leerzeichen liest.
Aber ich denke, es gibt noch eine andere, die
für C11 get get Unterstriche heißt, aber
darüber werden wir noch mehr sprechen, aber das ist nur eine Sache, an
die Sie denken sollten, wenn Sie Eingaben für Zeichenfolgen lesen. Es wird nur bis zum Leerzeichen gelesen.
Wie wäre es zu testen, ob zwei Zeichenfolgen gleich sind.
Nun, bis zu diesem Punkt haben wir alle
Variablen getestet, um festzustellen, ob sie gleich sind. Wir verwenden nur gleich gleich.
Aber mit Strings wird das nicht funktionieren.
Denken Sie daran, dass der Gleichheitsoperator Zeichenfolgenarrays sind, sodass Sie keine Operatoren für sie verwenden können.
Und der Gleichheitsoperator kann nur auf Ints und Doubles oder Floats
oder Zeichen angewendet werden.
Es funktioniert nicht bei Strukturen oder Arrays. Sie können nicht zwei Arrays vergleichen.
Es wird also nicht mit Strings funktionieren. Wenn Sie feststellen möchten, ob zwei Zeichenfolgen
gleich sind, müssen Sie die beiden Zeichenfolgen Zeichen für Zeichen explizit vergleichen.
Sie müssten also jedes Element im Array Index
für Index betrachten.
Das ist jedoch wirklich ein großes Problem, denn das wäre wirklich langweilig.
Wir werden also darüber sprechen, wie Sie dies sehr
einfach mit einer str-Vergleichsfunktion aus der Standardbibliothek tun können, aber Sie
können nicht die Gleichheit verwenden. Denken Sie daran.
Und noch einmal, nur zur Erinnerung, ich habe es ein paar Mal gesagt, ich möchte
es noch einmal sagen, die Zeichenfolgenkonstante x in
doppelten Anführungszeichen ist nicht die gleiche wie die Zeichenkonstante x in einfachen Anführungszeichen.
X in einfachen Anführungszeichen ist ein Grundtyp, es ist nur Zeichen
oder Pflege.
X in doppelten Anführungszeichen ist ein Laufwerkstyp, ein Array vom Typ char.
X in doppelten Anführungszeichen besteht wirklich aus zwei Zeichen, dem
x und dem Nullterminator, dem Nullzeichen. Denken Sie also daran.
Hier ist ein
Beispiel dafür, wie wir Zeichenfolgen erstellen können, indem
wir sie entweder mit einer Größe deklarieren oder in derselben Zeile initialisieren.
Dies ist die beste Vorgehensweise. Wenn Sie Zeichenfolgenliterale verwenden möchten,
würde ich genau
das tun, was hier steht, das Zeichenarray erstellen, keine
Größe angeben und dann rechts vom Zuweisungsoperator doppelte Anführungszeichen setzen.
Der Compiler erstellt automatisch die richtige Zeichenfolge und fügt einen Nullterminator hinzu.
Wenn Sie eine Größe angeben und dann nicht genügend Zeichen haben, wird diese nicht gespeichert.
Erstellen Sie also einfach Zeichenfolgenliterale, indem Sie
den Datentyp char, den Namen
der Variablen und dann leere Klammern verwenden.
Ich denke, dieses Programm wird die Zeichen in einem Array
zählen, also wird es im Wesentlichen die Länge der Zeichenfolge erhalten.
Was wir hier tun, ist, dass wir eine Variable mit dem Namen count in zwei Zeichenarrays mit
zwei verschiedenen Zeichenfolgen erstellen, um zu sein oder nicht zu sein,
und dann Komma, das ist die Frage.
Char str man wird nach b eine Lichtmaschine haben, und
str wird nach Frage eine Alternative haben.
Wir haben hier also eine Schleife, die das
erste Array durchläuft, von count gleich null bis wir einen Nullterminator sehen.
Und wir können in diesem Fall das ungleiche verwenden, weil wir ein Zeichen vergleichen.
Nullterminator als Zeichen. Es ist vollkommen in Ordnung, Charaktere zu vergleichen.
Unsere while-Schleife wird also den ganzen Weg durchlaufen, bis wir einen Null-Terminator sehen.
Sobald wir einen Nullterminator sehen, werden wir herausspringen.
Die Anzahl entspricht der Anzahl der Zeichen in dieser Zeichenfolge.
Es ist also die Länge dieser Zeichenfolge.
Wir machen das für beide Saiten. Und Sie werden feststellen, dass im
Grunde beide Saiten die richtige Länge haben, weil wir nur jede einzelne durchlaufen.
B oder nicht b bedeutet ungefähr
18 Zeichen.
Jetzt müssen Sie so etwas nie mehr wirklich tun, da
wir eine nette Hilfsfunktion mit Str-Länge haben, um Längen von Strings zu finden.
Dies zeigt jedoch erneut die Tatsache, dass es sich um ein Array handelt.
Und wenn Sie die Länge einer Zeichenfolge vergleichen oder ermitteln möchten, können Sie
das ungleiche Zeichen verwenden und sich das Zeichen, den Nullterminator, ansehen.
Ich hoffe das war hilfreich. So definieren und initialisieren wir String-Literale.
Vielen Dank.