C++-string mit Schleife durchsuchen, Abbruchbedingung

Bruno_Van_D

Grünschnabel
Guten Tag allerseits,

Uni bedingt muss ich mich nun mit C++ 'rumschlagen, obwohl ich mit Programmieren vorher nie viel zu tun hatte.

Nachdem ich mich in strings eingelesen hatte wurde es Zeit für erste Versuche, die auch ganz gut liefen, allerdings stieß ich bald bei der find()-Funktion auf ein Problem:

Es schien mir eine einfache Sache zu sein. Wenn ein Teilstring den ich suche mehrfach in einem anderen string vorkommt, lasse ich ihn eben eine Schleife durchlaufen.

Allerdings musste ich feststellen: Das mit den Abbruchbedingungen klappt nicht so ganz. In einem Thread hier im Forum habe ich etwas gefunden, mit dem ich folgendes konstruiert habe:

C++:
#include<iostream>
#include<string>

using namespace std;

int main()
{
	string zahlen = "eins zwei drei drei zwei eins";
	string such = "zwei";
	int anzahl = 0;
	int position = 0;
	do
    {
		position = zahlen.find(such, position );
		cout << "Position zwei: " << position << endl;
        position++;
		anzahl++;
    }
	while(position != zahlen.npos);
	cout << "Anzahl " << anzahl << endl;

	system ("pause");
}

Allerdings produziert das dann eine Endlosschleife. Aktuell versuche ich, das ganze in einem Array zu speichern und abzugleichen, wann sich das ganze anfängt zu wiederholen, was sich zwar nicht so einfach anlässt, wie ich dachte, aber zumindest möglich erscheint, auch wenn es wohl nicht die schönste Lösung ist.

Nun zu meiner Frage: Was für eine Abbruchbedingung müsste ich denn einbinden, um jede Position nur einmal aufzurufen?

Viele Grüße,
Bruno


[edit] Es scheint auch noch mehr falsch zu sein, da ich als dritten Wert eine -1 erhalte, mache mich nochmal selbst weiter auf die Suche, wäre für Hilfe aber trotzdem dankbar.

[edit2] Hm, das mit dem Array gibt doch auch einige Probleme, kann es sein, dass man in einer do{}-while-Schleife kein && in der Abbruchbedingung verwenden kann? Mein Versuch
"while( pos[anzahl-1] != pos [0] && anzahl != 1); liefert auf jedenfall nur ein Ergebnis...
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

die Abbruchbedingung ist am Schleifenbeginn besser aufgehoben, da "position" und "anzahl" nur bei erfolgreicher Suche inkrementiert werden dürfen:
C++:
while( (position = zahlen.find(such, position)) != zahlen.npos )
{
    cout << "Position zwei: " << position << endl;
    position++; anzahl++;
}
Die Vewendung von "&&" ist natürlich möglich. Wenn das Ergebnis nicht deinen Erwartungen entspricht, liegt der Fehler noch irgendwo anders.

Gruß
MCoder
 
Wow, vielen Dank MCoder,

Mit der Bedingung am Schleifenanfang klappt es super, hatte wohl noch ein oder zwei andere Fehler 'drinne, die ich dank deiner Hilfe aber wohl schnell selbst finden werde.

Ich wünsche noch einen schönen Rest-Sonntag und markiere das hier dann als gelöst

Viele Grüße,
Bruno
 
Zurück