Strings in C++ programmeren
In de programmeertaal C++ zijn er diverse bibliotheken. Een van de eerste die je zult leren kennen is de bibliotheek 'string' en de daarbij behorende functies. Wat kun je daar allemaal mee doen en hoe programmeer je dat?
Inhoudsopgave
De C++ string
In C++ is het mogelijk om met de 'string' bibliotheek (onder andere) karakters toe te voegen, te verwijderen, te vervangen, te zoeken en te vergelijken. Zoals je ziet heeft 'string' een eigen 'include' nodig voordat je deze bibliotheek kan gebruiken. Alle voorbeelden kunnen op de plek van het commentaar 'code' worden geplaatst en zijn zo simpel mogelijk gehouden, zodat het begrijpelijk is voor iedereen.
#include <iostream>
#include <string>
// using namespace std;
int main(){
// code
std::cin.get();
return 0;
}
Sommige programmeurs geven de voorkeur aan het gebruik van de namespace 'standard', zodat 'std::' niet de hele tijd voor elk commando hoeft te worden getypt. Wil je dit ook gebruiken, voeg dan 'using namespace std' toe onder je includes en laat 'std::' in de voorbeelden weg.
Strings initialiseren
Bekijk de string als een klasse en het wordt meteen duidelijk dat het een object is waar je meerdere instanties van kan maken en bewerkingen op mag uitvoeren met een aantal functies. Zo is het mogelijk om een string onder andere op de volgende manieren te initialiseren:
Voorbeeld:
std::string s1("Wat een mooie dag."); // ook toegestaan: std::string s1 = "Wat een mooie dag."
std::string s2(s1, 14, 3);
std::string s3(s1.begin()+4, s1.begin()+17);
std::cout << "\n" << s1 << "\n" << s2 << "\n" << s3 << std::endl;
Uitvoer:
Wat een mooie dag.
dag
een mooie dag
String s1 heeft als uitvoer exact wat er tussen aanhalingstekens staat. String s2 heeft drie parameters: een string (s1) en twee integers. De eerste int is om aan te geven vanaf welk punt s2 een kopie verlangt van s1 en de tweede int bepaalt hoeveel karakters er dan gekopieerd moeten worden.
Elke string begint op plek één met waarde nul, dus de letter 'd' van 'dag' staat op plek veertien.
String s3 heeft twee parameters; beide vragen iets aan s1 en maken er een kopie van. 'Begin()' wijst naar de eerste plek van de inhoud van s1, dus de combinatie van 'begin()+4' en 'begin()+17' betekent dat s3 een kopie maakt van de karakters in s1 vanaf plek vier tot en met zeventien.
Hoewel het aantal parameters in de constructor van een string kunnen verschillen, is er een overeenkomst in de syntax:
stringnaam.functienaam(parameters).
Samenvoegen van strings (+, +=, append)
We kunnen strings aan elkaar plakken door de operator '+' of '+=' te gebruiken. Beide opties doen exact hetzelfde, alleen is '+=' korter. De bewerking 'append' kan zelfs een deel van een andere string toevoegen.
Voorbeeld:
std::string s1("goede");
std::string s2("morgen");
std::string s3 = s1 + s2;
std::cout << s3 << std::endl;
std::string s4("de wereld ver");
s4 += "anderen"; // exact hetzelfde als std::string s4 = s4 + "anderen";
std::cout << s4 << std::endl;
std::string s5("iedereen kan ");
s5.append(s4, 10, 10);
std::cout << s5 << std::endl;
Uitvoer:
goedemorgen
de wereld veranderen
iedereen kan veranderen
String s5 gebruikt 'append' met drie parameters: een string, een int om de plek aan te geven voor het kopiëren en nog een int voor het aantal karakters dat gekopieerd moet worden.
Vergelijken van strings (==, !=, <, >)
Net zoals je kunt zeggen dat drie niet gelijk is aan acht, zo is het ook mogelijk om waarden van strings te vergelijken. In dat vergelijkingsproces gebruik je onder andere de operatoren 'is gelijk aan' (==) en 'is niet gelijk aan' (!=). In plaats van het uitprinten van een melding op je scherm, kunnen er natuurlijk hele andere bewerkingen plaatsvinden. Het ligt er maar net aan wat jij wilt dat er gebeurt. Merk op dat een 'if else'-constructie in het eerste voorbeeld dezelfde uitvoer zou geven.
Voorbeeld:
std::string s1("Amsterdam");
std::string s2("Utrecht");
if(s1 == s2){
std::cout << "Ik bezoek dezelfde stad";
}
if(s1 != s2){
std::cout << "Mijn keus voor de vakantie valt op Amsterdam";
}
Uitvoer:
Mijn keus voor de vakantie valt op Amsterdam
Als je bijvoorbeeld strings op lengte wilt vergelijken, gebruik je de operatoren 'kleiner dan' (<) en 'groter dan' (>) en de functie 'length()' op de gewenste string.
Voorbeeld:
std::string s1("abc is het begin van het alfabet");
std::string s2("abc");
if(s1.length() > s2.length()){
std::cout << "Lengte van string 1: " << s1.length() << " karakters" << std::endl;
std::cout << "Lengte van string 2: " << s2.length() << " karakters" << std::endl;
}
Uitvoer:
Lengte van string 1: 32 karakters
Lengte van string 2: 3 karakters
Invoegen, verwijderen en vervangen van strings (insert, erase, replace)
Met de functie 'insert' kies je een plek uit in een string waar je iets toe wilt voegen, 'erase' is exact het tegenovergestelde en verwijdert karakters. Je kunt ook een deel van een string vervangen door 'replace' te gebruiken.
Voorbeeld:
std::string s1="Mijn kleuren";
std::string s2="favoriete ";
std::string s3="wit, geel, rood, groen, blauw";
s1.insert(5, s2);
std::cout << s1 << std::endl;
s1.erase(20, 2);
std::cout << s1 << std::endl;
s1.insert(20, " is ");
s1.insert(24, s3, 5, 4);
std::cout << s1 << std::endl;
s1.replace(24, 5, "oranje");
std::cout << s1 << std::endl;
s1.erase(s1.begin()+5, s1.end()-15);
std::cout << s1 << std::endl;
Uitvoer:
Mijn favoriete kleuren
Mijn favoriete kleur
Mijn favoriete kleur is geel
Mijn favoriete kleur is oranje
Mijn kleur is oranje
Eerst is er op de vijfde plek van string s1 de gehele string s2 ingevoegd. Dit geeft als uitvoer: "Mijn favoriete kleuren". De eerste parameter geeft de positie aan (5), de tweede parameter (string s2) de verzameling in te voegen karakters.
Daarna gebruiken we s2 op dezelfde manier om 'en' weg te halen van het woord 'kleuren' en voegen we zoals in de eerste bewerking het woord ' is ' toe.
De vierde bewerking heeft vier parameters: de eerste duidt aan waar je wilt starten (positie 24 in s1), de tweede zegt welke string (s3), de derde wijst naar de positie van het karakter in string s3 waar je wilt beginnen (5), en met de vierde geef je aan hoeveel karakters je wilt invoegen (4).
We vervangen 'geel' met 'oranje' door 'replace', door opnieuw aan te geven vanaf welke positie je karakters wilt vervangen, de lengte van je nieuwe string en de karakters zelf.
Iets verwijderen uit een string kan ook op een andere manier, namelijk door uit te gaan van het begin (begin()) en het einde (end()) van je string en vervolgens met '+' of '–' door te geven hoeveel plaatsen de functie vanaf het begin en het einde moet optellen of aftrekken. Wat er overblijft wordt weggehaald.
Een gedeelte van een string verkrijgen (substr)
Als je een kleiner gedeelte van een string wilt inzien heb je de functie 'substr' nodig, een afkorting van 'substring'. In de eerste parameter geef je de startpositie door en in de tweede parameter de gewenste lengte van de substring.
Voorbeeld:
std::string s1("Het zonnestelsel is ontzettend groot.");
std::string s2 = s1.substr(0, 16);
std::string s3 = s2.substr(4, 3);
std::cout << s1 << "\n" << s2 << "\n" << s3;
Uitvoer:
Het zonnestelsel is ontzettend groot.
Het zonnestelsel
zon
Karakters in een string zoeken (find)
Met de functie 'find' is het mogelijk een string te doorzoeken. Je gebruikt als parameter een of meer karakters. Als het exact is teruggevonden krijg je de booleaanse waarde 'true' terug, anders 'false'. Door 'std::string::npos' te gebruiken, geef je aan dat je wilt zoeken tot het einde van de string die de functie 'find' heeft aangeroepen (in beide voorbeelden s1).
Voorbeeld:
std::string s1("Het groene gras");
std::string s2("lucht");
std::string::size_type zoek = s1.find(s2);
if(zoek != std::string::npos)
{
std::cout << "\'" << s2 << "\' gevonden op positie: " << zoek << std::endl;
}else{
std::cout << "\'" << s2 << "\' niet gevonden" << std::endl;
}
std::string s3("groen");
zoek = s1.find(s3);
if(zoek != std::string::npos)
{
std::cout << "\'" << s3 << "\' gevonden op positie: " << zoek << std::endl;
}else{
std::cout << "\'" << s3 << "\' niet gevonden" << std::endl;
}
Uitvoer:
'lucht' niet gevonden
'groen' gevonden op positie: 4
De string bibliotheek heeft meerdere functies, maar als je deze basisfuncties onder de knie hebt, zal de rest je weinig moeite kosten om te begrijpen.