\n's in std::string zählen

WorldRacer

Erfahrenes Mitglied
Hallo zusammen,

Ansatz:
bin für ein DirectX Overlay eine Kleine Listbox programmieren.
Die besteht aus einem std::string, der in etwa so aussieht:

Code:
std::string list = "Eintrag1\nEintrag2\nEintrag3";

Wie man sieht, sind die Einträge durch \n getrennt. Soweit funktioniert das auch, er zeigt die ListBox an. Ich möchte aber auch eine Funktion haben, die die Einträge in der Listbox zählt.

Ich habe folgendes geschrieben:

PHP:
// ### Variablen:
// Anzahl der Einträge (Temporär-Variable)
// .........   int count;
// Anzahl sichtbarer Einträge in der Listbox
// .........   int visibleitems ( = 2);
// String, der _alle_ Listeneinträge erhält:
// .........   std::string listitems (= "Eintrag1\nEintrag2\nEintrag3");
// String, der die _sichtbaren_ Listeneinträge enthält:
// .........   std::string visible_list = "";

if(listitems.size() > 0){
	for(int i = 0; listitems.size()-1; i++){
			if(count <= visibleitems){
				const char* c = listitems.substr(i, 1).c_str();
				if(c == "\n"){
					count++;
				}				
				this->visible_list.append(listitems.substr(i, 1));
				
			}	
		}
}

So sieht der Code dafür aus. Ich möchte, solang die Anzahl (count) kleiner als die Anzahl der sichtbaren Einträge (visibleitems) bleibt, alle Zeichen die in der Schleife ausgeworfen werden der "sichtbaren Liste" hinzufügen.

Hinterher sollte es so aussehen:
Eintrag1
Eintrag2

Problem:
Beim ausführen der Schleife stürzt die Anwendung ab. Es gibt einen Runtime error, der die Anwendung beendet. Ich gehe mal davon aus, das hier irgendwo ein Speicherzugriffsfehler steckt. Ich weiß nur nicht wo.

Danke schonmal für eure Hilfe.

Grüße,

WR
 
Is jetzt nur geraten, aber probier mal

C:
if(listitems.size() > 0){
	string temp = "";
	for(int i = 0; i < listitems.size()-1; i++){
		if(count <= visibleitems){
			const char* c = listitems.substr(i, 1).c_str();
			if(c == "\n"){
				count++;
				this->visible_list.append(temp.c_str());
				temp = "";
			}
			else temp.append(listitems.substr(i, 1).c_str());				
		}	
	}
}

PS: Fuer string brauchst du ein #include <string.h>. Eventuell auch <cstring> aber wie gesagt, den Code kann ich gerade nicht testen.
 
Zuletzt bearbeitet:
Moin,

Deine for-Schleife sollte besser so aussehen:

Code:
statt
for(int i = 0; listitems.size()-1; i++){ 

besser 
for(int i = 0; i < listitems.size()-1; i++){

Gruß
Klaus
 
Aufwendiger geht's aber fast nicht mehr ;)

Außerdem wird es nicht funktionieren, da du dort Zeiger miteinander vergleichst.

C++:
size_t items_count = std::count(listitems.begin(), listitems.end(), '\n');
Warum speicherst du denn die Listenelemente nicht einfach in einem std::vector?

Gruß
 
std::vector sagt mir im moment gar nichts...Hm das std::count gibt es net. Welche header muss ich denn dafür einbinden?
 
Zuletzt bearbeitet:
OK, das hier ist die Lösung.

PHP:
if(listitems.size() > 0){
		count++;
		for(int i = 0; i < listitems.size(); i++){
			if(count <= visibleitems){
				if(strcmp(listitems.substr(i, 1).c_str(),  std::string("\n").c_str()) == 0){
					count++;
				}                
				this->visible_list.append(listitems.substr(i, 1));
                
			}    
		}
	}

Den String nehme ich deshalb, weil er dynamisch ist.
 

Neue Beiträge

Zurück