STL: wie string in map<> anhängen?



  • Hallole.
    Ich habe eine map angelegt in der ich strings ablege:

    map <int,std::string> mon_map;
    ....
    
    mon_map.insert(make_pair(o,str_monat));
    
    usw...
    

    "o" ist dabei eine Laufvariable und str_monat ein Teilstring eines anderen strings.

    Jetzt habe ich eine Situation in der ich an einen Vorhandenen string in der map einen string anhängen sollte. Nur wie geht das?
    Mit zB: mon_map.append gehts nicht und auch sonst habe ich keine Idee wie das funktionieren könnte.

    Weiß da jemand bescheid?

    Danke mal Mondmann



  • Du willst den bereits vorhandenen String verlängern, sehe ich das richtig? Dazu kannst du dir über den Index-Operator den String holen und direkt verarbeiten:

    mon_map[i]+=ergaenzung;
    


  • Du mußt mit second auf den Value deines Mapeintrags zugreifen. So in etwa:

    mon_map.find(i)->second.append("abc");
    


  • Meinst Du sowas?

    mon_map.insert(make_pair(5, "hallo"));
    mon_map[5] += ", welt";
    

    Wahlweise kannst Du natürlich alle Methoden von std::string verwenden, allerdings natürlich nicht auf mon_map, sondern auf dem String mon_map[element]

    EDIT:
    Me == Verlierer des Hot-Button 😃



  • Hallo Ihr 3, CStoll war mal wieder am schnellsten:-)

    Das das so einfach ist, hätte ich mir ja eigentlich denken können, vor allem daß ich das ich mit dem index drauf zugreifen kann, ist ja das einfachste der Welt(mich selber aufreg).

    Tja aber man lernt ja schließlich nie aus,oder?

    Vielen, herzlichen Dank, Mondmann



  • Hallo. Jetzt habe ich allerdings noch ein Problem:

    wenn ich einen string anhänge:

    mon_map[o]+=str_monat;
    

    str_monat ist ein substring eines anderen strings, dann kommt zwar keine Fehlermeldungen,aber es funktioniert irgendwas nicht.

    Wenn ich einen Text direkt anhänge:

    mon_map[o]+="Hallo ich bin ein Text";
    

    Dann gehts.
    Warum ist das so?
    So, ist das so ausreichend oder soll ich Näher drauf eingehen?
    Ist schwierig zu erklären.

    Mondmann



  • Hast du schon nachgesehen ob in str_monat überhaupt was drinnsteht? Bzw wie macht sich der Fehler denn bemerkbar?



  • Ja da steht was drin, habe ich geprüft.
    Ich mache gerade screenshots.



  • So. Also der Fehler wird in der weiteren Verarbeitung der map bemerkbar.
    Siehe die Screenshots, viellicht kann jemand was damit anfangen.

    Man sieht,daß in der map 3 Keys drin sind mit jeweils dem zugehörigen string.
    map<int,string>.

    Wenn der String nach dem Anhängen ok ist, dann sieht es aus wie bei [0] und [1].
    Entweder wird der string gleich angezeigt wie bei[1] oder es wird 0, angezeigt wie bei [0]. Wenn ich das aufklappe, dann wird der entsprechende string angezeigt.

    BEi [2] ist aber ein entscheidender Unterschied:
    Es wird in der Übersicht 2,"" angezeigt, das bedeutet also ein leerer string!
    KLappe ich es auf, dann sieht es si aus, wie beim Screenshot "Fehler2". ALso der Text ist schon irgendwo vorhanden,aber ich weiß nicht wo.
    Und hier ist auch der Fehler in der weiteren Verarbeitung: Es wird als leerer String erkannt.

    Hänge ich an die Map einen selbst eingegenen Text an

    mon_map[o]+="Hallo ich bin ein Text";
    

    Dann sieht es so aus wie im Screenshot "Fehler3", also alles in Ordung und er wird auch so erkannt.
    Man sieht also den UNterschied in der Übersicht steht 2, und nicht 2,"" wie im "Fehler1" und "Fehler2".

    Das anhängen scheint nur zu funktionieren wenn ich es so mache wie im o.g. Beispiel, nicht aber wenn ich einen substring anhänge.

    SO, ich hoffe ich konnte es etwas verdeutlichen.

    Grüße Mondmann

    PS: Wie kann ich hier einen Anhang reinstellen????



  • Du kannst hier keine Dateien anhängen. Musst sie wenn dann auf nen Webspace laden und hier verlinken.

    Greetz



  • Kopier die Fehlermeldungen (wenn möglich) lieber in Text-Form hier herein. Wenn du unbedingt Sceenshots anhängen willst, mußt du die bei einem anderen Anbieter hochladen und dann hierher verlinken.

    PS: Und eventuell reicht es schon, wenn du mal etwas mehr Code vorlegst.



  • Ok die Screenshots könnt Ihr hier angucken:
    http://www.djteamheber.de/screenshots/

    sie heissen eben nacheinander fehler1, fehler2 und fehler3.

    map <int,std::string> mon_map;
    				string ausdruck,str_monat,str_monat1,str_monat2,br="<br>";
    				ausdruck="|";
    				ausdruck+="\r";
    				//ausdruck+="2";
    				//kalkomm+="2";
    
    				size_t pos,len;
    
    				for(o=0,pos=0;o<24;o++)
    				{
    					pos=kalkomm.find(ausdruck);
    					if(pos!=string::npos)
    					if(kalkomm[pos+2]!='\n')
    					if(pos!=string::npos)
    					{
    					str_monat=kalkomm.substr(0,pos);
    
    					str_monat1=str_monat.substr(5,3);
    						if(str_monat1==str_monat2)
    						{//Doppelter Monat abfangen
    
    							str_monat.erase(0,8);
    							o-=1;
    							//mon_map[o]+=str_monat;
    
    							mon_map[o]+="Hallo Text";
    
    							//o+=1;
    							//mon_map.insert(make_pair(o,str_monat));
    							str_monat2=str_monat1;
    							kalkomm.erase(0,pos+2);
    						}
    						else
    						{
    						str_monat2=str_monat1;					
    						mon_map.insert(make_pair(o,str_monat));
    						kalkomm.erase(0,pos+2);
    						}
    					}
    				}
    
    				std::istringstream st;
    				std::string str_komm,str_test;
    				size_t map_len;
    
    				//Anzahl der gesendeten Monate (max. 2 ?)
    				map_len=mon_map.size();
    
    				for(o=0,pos=0;o<map_len;o++)
    				{
    					str_test=mon_map[o];
    					st.clear();
    					st.str(str_test);
    						for(i=0;i<33;i++)
    						{str_komm="";
    							getline(st,str_komm,'|');
    							if(st.good())
    								if(i>1)
    								{
    									if(str_komm=="¿")
    									strcpy(komm_text[o][i-2]," ");
    									else
    									{
    
    									//Einmal für \r\n
    									len=str_komm.length();
    									for(int u=0;u<len;)
    									{
    										pos=str_komm.find("\r\n");
    										if(pos!=string::npos)
    										{
    										str_komm.replace(pos,2,br);
    										u=pos;
    										len+=2;
    										}else break;
    
    									}
    
    										pos=str_komm.find("\r");
    										if(pos!=string::npos)
    										{
    										str_komm.replace(pos,1,br);
    
    										}								
    
    									strcpy(komm_text[o][i-2],"<br>_______<br>");
    									strcat(komm_text[o][i-2],str_komm.c_str());
    									}
    
    								}	
    						}
    				}
    

    Also hier der Code um den es sich dreht,ich verarbeite hier einen Stream den ich per Socket von einer SOftware bekomme und mache den sozusagen HTML tauglich.
    Ihr könnt warscheinlich nicht viel damit anfangen, da es was sehr spezifisches ist...



  • Na, hats Euch die Sprache verschlagen?



  • Wäre echt toll wenn jemand was wüsste, ich habe das Problem immer noch....und ich komm einfach nicht weiter.



  • Wenn dich nur die Anzeigen des Debuggers stören, das ist (vermutlich) kein Fehler - wichtiger ist vielmehr, daß dein Programm das macht, was es machen soll.

    (und op[] legt einen neuen Eintrag mit dem gegebenen Schlüssel und einem leeren Wert in der map an, wenn es den Schlüssel nicht gefunden hat - das bedeutet, dieses kryptische Objekt in [Fehler 2] stellt wohl einen leeren String dar)


Log in to reply