Vector Elemtn mit Zeichenkette vergleichen
-
Hallo Leute, ich habe folgendes Problem.
Ich habe einen vector in dem zur Laufzeit neue Elemente hinzugefügt werden.
Bevor ein Element hinzugefügt wird, möchte ich allerdings testen, ob es schon im vector enthalten ist.
... #include <vector> using namespace std; int main () { char name[20]; vector<char> liste; .... // char name über cin füllen .... // jetzt prüfen ob es schon drin ist for ( unsigned int i = 0; i < liste.size(); i++ ) { if ( ( strcmp(name,liste[i]) ) == NULL ) { // Das Programm ist Multithreaded deshalb die CriticalSection EnterCriticalSection(&CritSec); cout << endl; cout << "Name ist schon vorhanden : " << name << endl; LeaveCriticalSection(&CritSec); } } ..... // Irgendwas machen z.B: Threads starten ..... return 0; }Jetzt sagt mir das Programm allerdings, bei jedem Namen den ich eingeben, er sei schon vorhanden. Woran liegt das ?
Habe schon mit strcmp rumexperimentiert, brachte aber auch nichts.Danke
-
Du hast einen vector<char>, da kannst du nur einzelne Zeichen unterbringen - für dich wäre ein vector<string> vermutlich nützlicher (bzw. ein set<string>, das verhindert von selber Doppeleintragungen).
-
Das Problem ist, dass ich bei diesen String geschichten net so ganz durchblicke.
Wenn ich einen vector<string> mache, dann muss ich den nachher explizit in ein char casten, da ich es an Funktionen übergebe
die als Parameter char nehmen und nicht String. Wie gesagt, ich versteh das noch net so ganz mit den Strings. Ich komme von C und da gibts halt nur char hatte nie mit CString zu tun. Übrigens hab ich vector<char *> nicht vector<char> war ein Tippfehler. set<string> kenne ich nicht. Mal eben nachschlagen.
-
Rubber schrieb:
Das Problem ist, dass ich bei diesen String geschichten net so ganz durchblicke.
Wenn ich einen vector<string> mache, dann muss ich den nachher explizit in ein char casten, da ich es an Funktionen übergebe
die als Parameter char nehmen und nicht String.Dafür gibt's die Methode "c_str()"
Übrigens hab ich vector<char *> nicht vector<char> war ein Tippfehler.
Lass mich raten, den füllst du mit "liste.push_back(name);" - böser Fehler, weil du da alle Vektor-Elemente mit der Adresse des Arrays 'name' füllst (und dann vergleicht strcmp() mit sich selbst).
Wenn du schon unbedingt mit char* arbeitest, mußt du für jeden Namen einen neuen Speicherbereich reseriveren und die Adresse DAVON dann in den vektor packen (string hätte da den Vorteil, daß es sich selber um solche Probleme kümmert).set<string> kenne ich nicht. Mal eben nachschlagen.
Mach das.
-
Danke für die Hilfe,
habe mich jetzt doch entschieden string zu verwenden. Ist wesentlich einfacher, habt ihr vollkommen recht.
Dass es so einfch ist mit c_str() den String als Char auszugeben war mir nicht klar. Deutliche Verbesserung gegenüber C.
Allerdings muss man ja dann auch mit stringstreams arbeiten Zwecks dem Zusammenschneiden. Aber da les ich mich mal in Ruhe rein.Stimmt das Beispiel ? ( Nur um zu wissen ob ich es begriffen habe
)... stringstream StrStr; string Str; string Name = "Jakob"; StrStr << "Hallo " << Name << " , wie gehts ?"; Str = StrStr.str(); cout << Str << " oder " << Str.c_str() << endl; ...Thx
-
Ja, das dürfte stimmen - aber Strings können auch direkt miteinander verkettet werden:
string Name = "Jakob"; string Str = "Hallo " + Name + ", wie geht's?"; cout<<Str<<endl;(du mußt nur aufpassen, wenn du zwei String-Literale miteinander verketten willst - "string Str = "Hallo " + "Jakob";" klappt nicht)
StringStreams sind erst dann wirklich notwendig, wenn du sprintf mit C++ Methoden nachbilden willst.
-
Genau das muss ich. Hatte vorher eine zeichenkette mit sprintf zusammengeschnitten, bekam aber vom compiler die meldung Deprected, also hab ich mich umgesehen. hab aber nix passendes gefunden. außer jetzt bei den strings über stringstream.
hatte vorher mal das versucht:
.. int a = 2, b = 4, c= 5, d = 7; string Str; Str = a + "-" + b + "-" + c + "-" + d + "-"; ...gab compiler fehler, er meinte er könnte keine 2 zeiger addieren.
deshalb stringstreams, oder ?
Besten Dank
-
Ja, an der Stelle brauchst du StringStreams (wie gesagt: wenn du einen Ersatz für sprintf benötigst, bist du hier an der richtigen Adresse).
-
Super, danke.