Strings vergleichen?



  • Hallo
    Ich bastle grade an einem CD Verwaltungsprogramm (Konsole). Ich schreibe die Eingaben vom Benutzer in einer externen .dat Datei und will von dort wieder lesen.
    Der Benutzer soll ein Suchwort eingeben können (habs mit getline(cin, eingabe);)
    und ich wills so machen, dass wenn eingabe=Titel (aus der Datei) ist er dann z.b "hallo wie gehts" ausgibt.
    Ich habs schon probiert (siehe if Schleife mit compare in der Mitte des Quellcodes^^) aber die Stelle bei der ich die 2 Strings vergleiche kriegt ich einfach net hin T_T

    Hier mein Code dazu:

    #include <iostream.h>
    #include <conio.h>
    #include <string>
    #include <fstream>
    
    struct Lied
    {
     string Titel;
     string CDname;
     string Kuenstler;
     string Leange;
     string Musikrichtung;
    };
    
    void datenspeichern(Lied Daten){
    ofstream out ("CD.dat", ios::app);    //speichert alle Eingaben in die Datei "CD.txt"
    cout <<endl;
    cprintf ("Geben sie die Musikdaten ein: ");
    
    cout <<endl;
    cprintf ("Titel des Liedes:");
    getline(cin,Daten.Titel);
    out <<  Daten.Titel;
    out <<endl;
    
    cout <<endl;
    cprintf ("CD Name, das das Lied enthealt:");
    getline(cin,Daten.CDname);
    out <<  Daten.CDname;
    out <<endl;
    
    cout <<endl;
    cprintf ("Kuenstler:");
    getline(cin,Daten.Kuenstler);
    out << Daten.Kuenstler;
    out <<endl;
    
    cout <<endl;
    cprintf ("Leange des Liedes:");
    getline(cin,Daten.Leange);
    out <<  Daten.Leange;
    out <<endl;
    
    cout <<endl;
    cprintf ("Musikrichtung des Liedes:");
    getline(cin,Daten.Musikrichtung);
    out <<  Daten.Musikrichtung;
    
    cout << endl;
    cprintf ("Ihre Daten wurden gespeichert!!");
    
    out.close();
    
    }
    void datensuchen(Lied Daten){
    string suche;
    int gefundene_titel=0;
    ifstream in ("CD.dat");
    if(!in){
            cprintf ("Datei kann nicht geoeffnet werden, pruefen sie ob die Datei CD.dat im selben Ordner liegt!!");
            cout << endl;
            }
    cprintf ("Geben sie Ihren Suchbegriff ein: ");
    getline(cin,suche);
    while (!in.eof()){  //Die Datei CD.dat wird bis zu Ende gelesen
          getline(in,Daten.Titel);
          getline(in,Daten.CDname);
          getline(in,Daten.Kuenstler);
          getline(in,Daten.Leange);
          getline(in,Daten.Musikrichtung);
          if (Daten.Titel.compare(suche)                       // Das hier funktioniert nicht !!!
         || Daten.CDname.compare(suche) || Daten.Kuenstler.compare(suche)
          || Daten.Leange.compare(suche) || Daten.Musikrichtung.compare(suche))
            {
          gefundene_titel++;
          cout << endl;
          cout << "Titel: " << Daten.Titel <<endl;
          cout << "ist auf der CD: " << Daten.CDname <<endl;
          cout << "Kuenstler: " << Daten.Kuenstler <<endl;
          cout << "Abspieldauer: " << Daten.Leange <<endl;
          cout << "Musikrichtung: " << Daten.Musikrichtung <<endl;
          }
    }
    cout << endl;
    cprintf ("Es wurden ");
    cout << gefundene_titel;
    cprintf (" Titel gefunden");
    in.close();
    
    }
    
    void main () {
    int warte;
    int eingabe;
    
    Lied Daten;
    textcolor(CYAN);
    while (true){
    cprintf ("2.Daten speichern");
    cout << endl;
    cprintf ("3.Daten suchen");
    cout << endl;
    cprintf ("4.Exit");
    cout << endl <<endl;
    cprintf ("Weahlen sie ein Menuepunkt aus: ");
    
    char c = getch();
    eingabe = c-'0';
    cout << endl;
    //cin >> eingabe;
    
    if (eingabe==2){
    datenspeichern(Daten);
    }
    if (eingabe==3){
    datensuchen(Daten);
    }
    if (eingabe==4){
    exit(0);
    }
    if (eingabe!=1 && eingabe!=2 && eingabe!=3 && eingabe!=4){
    cout << "Ungueltige Eingabe, geben sie ein Menuepunkt an";
    }
    cout << endl;
    cprintf (" druecken sie eine beliebige Taste um zurueck zum Hauptmenue zu gelangen");
    getch();
    clrscr();
    cout << endl;
    }
    cin >> warte;
    }
    


  • compare liefert 0 also false wenn die strings übereinstimmen.
    Verwende doch einfach if(s1 == s2)



  • hi
    das geht leider auch nicht, wenn man es in

    if (Daten.Titel==suche)
    

    Obwohl das Argument stimmt wird die die if Anweisung nicht aktiviert. Selbst mein Lehrer ist daran verzweifelt, also muss das Problem net leicht zu lösen sein denk ich.



  • Hallo

    Hast du mit dem Debugger geteste, ob die der Vergleich positiv ausfällt. Wenn dies der Fall ist, so sollte auch der Anweisungsteil abgearbeitet werden.

    chrische



  • ich hab die ganze Routine überprüft mit == und die Werte die ich eingebe sind gleich der Variable. Wenn ich compare benutze geht er schon in die If Anweisung, aber er zeigt alles in der Datei an -.-

    Zurzeit probier ichs mit nem Char Array, aber auch erfolgslos xD
    Vielleicht gehts ja bis abends...



  • Also irgend etwas machts du noch falsch.
    Ich sage schon, dass die compare Methode in Bezug auf die if-Anweisung genau das gegenteilige Ergebnis liefert. Also wenn bei titel == suche nicht in den IF-Zweig gelaufen wird, dann läuft er logischer Weise bei titel.compare(suche) in den IF-Zweig. Das beweist nur, das die beiden Strings eben nicht gleich sind. Du must einfach ein bisschen probieren um rauszubekommen was du falsch machst. Auf jeden Fall kannst du dich auf die Regeln verlassen. Wenn "titel" und "suche" beide von Typ string sind und beide den gleichen Inhalt haben, dann liefert der Ausdruck "titel == suche" mit Sicherheit true.



  • jo da hast du völlig Recht gh
    Ich verwende wieder if(s1==s2) und hab jetzt den Fehler gefunden, aber weiß net wie ich ihn behebe.
    Also bis jetzt war es so. Wenn ich als Eingabe z.B. "Greenday" eingebe findet er nichts.
    Sobald ich aber Greenday + ein Leerzeichen eingebe spuckt er mir alles aus, also Titel, CDname usw.

    Jetzt ist es aber natürlich doof wenn der Benutzer jedes mal wenn er was eingibt noch n Leerzeichen mit eingeben muss um was zu finden. Wie kann ich daher dieses Problem beheben?



  • irgend wie muss ich ein
    out << backspace hinkriegen, kenne aber die Syntax nicht



  • Hallo

    Du könntest zum Beispiel die Benutzeingabe ("Greenday") mit der Datenbank vergeleichen und dabei immer die letzte Stelle in der Datenbank abschneiden.

    chrische



  • Du könntest auch mal sowas ausgeben: "|" << Titel << "|", dann siehst Du wer da ein Leerzeichen (Zeilenwechsel? Tab?) wo hat. Wenn sich ein Muster erkennen lässt (weiss z.B. nicht auswendig ob getline das \n mit in den string packt) die Strings entsprechend vor dem Vergleich modifizieren.

    Und wenn Dein Lehrer an sowas verzweifelt, statt es Dir erklären zu können, sollte er vielleicht mal Grundlagen pauken...



  • Du könntest auch mal sowas ausgeben: "|" << Titel << "|", dann siehst Du wer da ein Leerzeichen (Zeilenwechsel? Tab?) wo hat. Wenn sich ein Muster erkennen lässt (weiss z.B. nicht auswendig ob getline das \n mit in den string packt) die Strings entsprechend vor dem Vergleich modifizieren.

    Und wenn Dein Lehrer an sowas verzweifelt, statt es Dir erklären zu können, sollte er vielleicht mal Grundlagen pauken...



  • möglich wäre auch ein

    size_t p = Lied.Titel.find("Greenday");
    if(p != Lied.Titel.npos)
    {
       // Titel enthält die Zeichenkette Greenday
    }
    

    Dann suchst du nicht nach dem genauen Titel, sondern nur, ob das Wort im Titel enthalten ist. Find ich persönlich auch praktischer (siehe winamp, da is das auch so)


Log in to reply