<string>... falsche Anwendung?
-
string str; vector<string> str_names for(int i=0;i<3;++i) { str="TestSignal_"; str_names.push_back(str+(char)i); cout<<"str_names["<<i<<"]="<<str_names[i]<<endl; }ich erwarte, dass mein vector die Strings:"TestSignal_0", "TestSignal_1", "TestSignal_2" enthält, aber es ist nicht so...
Warum????? wie mache ich es richtig?
DAnke
Carmen
-
Weil du mit (char)i das Zeichen mit dem ASCII-Code i bekommst (0 ist die Stringende-Marke, 1 und 2 sind nicht darstellbare Steuerzeichen) und nicht die Ziffer 'i'. Schau am besten mal in die FAQ, wie man Zahlen in Strings umwandeln kann.
OK, in deinem einfachen Fall (solange es einstellig bleibt), reicht schon eine einfache Umrechnung:
str_names.push_back(str+(i+'0'));
-
Was kommt denn bei dir raus?
-
Du wandelst eine Zahl in ein ASCII-Zeichen um (char ist genau 1 Zeichen) und hängst das an den String an, und da ASCII 0 bis 3 nicht druckbare Zeichen sind, siehst du nichts.
Für "Einmal Zahl und zurück" (siehe auch FAQ) nimmt man stringstreams:
vector<string> str_names; for(int i=0;i<3;++i) { stringstream str; str<<"TestSignal_"; str<<i; str_names.push_back(str.str()); cout<<"str_names["<<i<<"]="<<str_names[i]<<endl; }
-
stringstream str; vector<string> str_names; str<<"TestSignal_"; for(int i=0;i<3;++i) { str<<i; str_name.push_back(str.str()); cout<<"str_name[i]="<<str_name[i]<<endl; }aber es wird Testsignal_1, TestSignal_01, TestSignal_012 ausgegeben...
Ich habe versucht mit str.putback(i) aber es klappt nicht
-
pushback( ) uebergibt eine Referenz , der Inhalt bleibt gleich , da dieselbe Variable benutzt wird. es wird nur das einzelne Zeichen (char)i angehaengt.
-
qcarmen: Vergleich mal deine Schleifenstruktur mit der von LordJaxom. Erkennst du die Unterschiede?
-
@bumbytie: Du hast nicht recht.das ist nicht der Grund der falscher Ausgabe
@CStoll: Ich habe die Ironie in deiner Frage gespürt ...aber ich werde weiter die blödesten Fragen stellen, da diese Forum sehr gut ist und bringt mich wirklich weiter. Du kannst C++ sehr gut und ich lerne gerade, aber dafür kann ich andere Dinge ganz gut.http://www.c-plusplus.net/forum/images/smiles/wink.gif

Ich wollte nicht jedes Mal stringstream neu definieren innerhalb der for- Schleife. Ich dachte es klappt mit str.clear() oder str. flush() oder str. putback()...darum habe ich die außerhalb der Schleife definiert(aber es hat nicht funktioniert...) So wie LordJaxom ... läuft ganz gut, aber ist es effektiv?Danke
-
Auf jeden Fall mußt du irgendwie am Anfang jedes Schleifendurchlaufs die alte Nummer wieder aus dem Stream rausschmeißen, sonst wird das nichts. Und wenn du keine Lust hast, den Stream jedes Mal neu anzulegen - du kannst ihm per str() auch einen neuen Puffer zuweisen:
stringstream conv; for(int i=0;i<3;++i) { conv.str("Testsignal_"); conv<<i; str_name.push_back(conv.str()); }
-
vielleicht ist das nicht der einzige , aber es spielt definitiv eine Rolle. Aber der Post von CStoll bestaetigt das , und der funktionierende code von LordJaxom beruecksichtigt das auch. Deinen letzten code-ausschnitt habe ich geringfuegig umgebastelt ( i.B. stream-deklaration in den scope der for-schleife ) , und siehe da: es klappt.
std::vectorstd::string str_names;
for(int i=0;i<3;++i)
{
std::strstream str;
str<<"TestSignal_";str<<i<<'\0';
str_names.push_back(str.str());
std::cout<<"str_name[i]="<<str_names[i]<<std::endl;
}