Zeichen eines Textes
Ein std::string-Text ist kein Vektor, aber ihm in vielem ähnlich: Er ist eine Folge von Zeichen. Jedes Zeichen hat einen Index, von 0 an gezählt, und du kannst es mit eckigen Klammern oder der Methode at() lesen:
std::string wort = "Code";
std::cout << wort[0] << std::endl;
std::cout << wort.at(1) << std::endl;
std::cout << wort[wort.size() - 1] << std::endl;Das gibt aus:
C
o
eIn C++ hat ein einzelnes Zeichen einen eigenen Datentyp, char, den du aus der Lektion über Variablen kennst. Ein aus einem Text gelesenes Zeichen kannst du also in einer char-Variablen speichern. Einen char-Wert schreibst du in einfachen Anführungszeichen, 'C', und einen Text in doppelten, "C". std::cout gibt ein Zeichen ohne Anführungszeichen aus:
char erstesZeichen = wort[0];
std::cout << erstesZeichen << std::endl;
if (erstesZeichen == 'C') {
std::cout << "Beginnt mit C" << std::endl;
}Das gibt aus:
C
Beginnt mit CEin häufiger Fehler ist, ein Zeichen mit einem Text in doppelten Anführungszeichen zu vergleichen: if (wort[0] == "C"). Dann lässt sich das Programm nicht kompilieren:
main.cpp:7:17: error: comparison between pointer and integer ('value_type' (aka 'char') and 'const char *')Die Meldung spricht davon, einen Zeiger mit einer Ganzzahl zu vergleichen. Zeiger lernst du in der Lektion über Referenzen und Zeiger kennen. Merke dir vorerst: Siehst du diesen Fehler bei einem Zeichen, ersetze die doppelten Anführungszeichen durch einfache.
Die Anzahl der Zeichen bekommst du mit der Methode size(), genau wie bei einem Vektor. Ein Text hat auch die Methode length(), die dieselbe Zahl liefert. Leerzeichen und Satzzeichen sind ebenfalls Zeichen, "Hallo, Tom!" hat also 11 Zeichen:
std::string gruss = "Hallo, Tom!";
std::cout << gruss.size() << " " << gruss.length() << std::endl;Das gibt aus:
11 11Ein Index außerhalb des Textes funktioniert genauso wie bei einem Vektor: wort[10] liest etwas Sinnloses, und wort.at(10) bricht das Programm mit einem Fehler ab.
Du kannst auch ein Zeichen eines Textes ändern:
std::string name = "Tim";
name[0] = 'K';
std::cout << name << std::endl;Das gibt aus:
KimVorsicht bei Buchstaben wie ä, ö, ü und ß. Sie belegen in einem Text zwei Bytes, also zwei chars (so speichert die Kodierung UTF-8 Text). "Käse" hat deshalb die Größe 5, nicht 4, und "Käse"[1] ist nur die erste Hälfte des ä. Solche Texte kannst du problemlos ausgeben, aber verwende für Texte, bei denen du mit einzelnen Zeichen arbeitest, Wörter ohne Umlaute und ß.
So schreibst du es:
Anweisungen
- 1
Speichere das erste Zeichen des Textes
namein einerchar-Variablen mit dem NamenerstesZeichen. Du kannst eckige Klammern oder die Methodeat()benutzen. - 2
Gib in einer Zeile das erste Zeichen, das letzte Zeichen und die Anzahl der Zeichen des Namens aus, durch Leerzeichen getrennt. Finde das letzte Zeichen mit
size() - 1oderlength() - 1. Die Ausgabe sollte die ZeileT a 4enthalten. - 3
Schreibe darunter eine Anweisung, die das erste Zeichen des Namens in
'N'ändert, und gib den Namen dann aus. Die Ausgabe sollte die ZeileNinaenthalten.