2 Strings Vergleichen



  • Hallo,

    ich muss 2 strings vergleichen. Und das muss wie folgt aussehen.
    wenn mindestens 3 zusammenhängende zeichen vübereinstimmen soll
    mein programm sagen das da übereinstimmungen waren.



  • Cool. Hast du auch eine Frage, oder wolltest du uns das nur mitteilen?



  • Sind die Übereinstimmungen an der selben Stelle z.B. bei "eins" und "keine" würden ja 3 ("ein") übereinstimmen, aber eben an unterschiedlichen Stellen.
    Sind die zu vergleichenden Stringteile irgendwie bekannt ?

    @MFK
    Er will uns vermutlich fragen, ob wir ihm dabei helfen können.



  • Wenn ich mir die Threads der letzten Wochen anschaue bekomme ich das Gefühl, dass irgendwelche Schulen massiv damit begonnen haben, den C++ Builder im Unterricht einzusetzen. Das ist ja eigentlich zu begrüßen.

    Nun denn. Kann jemand dem Manuel ein gutes Programmierungs-Einführungsbuch empfehlen?



  • du kannst z.B. so vergleichen

    string str;
    string str2;

    if (str.equals("Irgendetwas"));
    {...}

    oder

    if (str.equals(str2))

    bei 3 Strings geht es so

    if ( (str.equals(str2)) && (str.equals(str3)) && (str3.equals(str2)) )

    Hoffe es stimmt 😃



  • Thema verfehlt...

    Wenn man in 2 Strings das Vorhandensein von X Bytes erkennen will, braucht man eine umfangreichere Logik. Man muß prüfen, welcher String von beiden größer ist. Mit dem ersten Byte des kleineren Strings sucht man im größeren String nach Übereinstimmung. Liegt diese vor, muß man prüfen, ob (X-1) Bytes des kleineren Strings auch im größeren String folgen. Falls ja, hat man eine Übereinstimmung gefunden und kann <JA> zurückgeben.



  • Nachdem heute anscheinend Tag der Nettigkeit und Hilfsbereitschaft ist, hier ein Ansatzpunkt von mir, auch auf die Gefahr hin, dass es jetzt gleich alle besser können 🙂

    Ich hab 2 Edit zur Eingabe, 1 Button zum Start, 1 Label zum Anzeigen der Anzahl und 1 ListBox zum Anzeigen der Übereinstimmungen genommen.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    String str1=Edit1->Text.c_str();   //einlesen von Edit1
    String str2=Edit2->Text.c_str();   //einlesen von Edit2
    int summe=0;
    ListBox1->Clear();
    
    for(int i=1; i<=str1.Length()-2;i++)   //zählt im 1. String bis (Länge-2)
            {
            for(int j=1; j<=str2.Length()-2;j++) //zählt innerhalb der 1. schleife im 2. String bis (Länge-2)
                    {
                    if(MidStr(str1, i, 3)==MidStr(str2, j, 3))  //vergleicht die beiden 3er-Blöcke ab position i bzw. j
                            {
                            ListBox1->Items->Add(MidStr(str1, i, 3));  //schreibt den übereinstimmenden 3er-Block in die Liste
                            summe++;
                            }
                    }
            }
    Label1->Caption=summe;
    }
    //---------------------------------------------------------------------------
    

    Ich hoffe, das hilft ein Stück weiter.

    @JFK

    Man muß prüfen, welcher String von beiden größer ist

    Muss man für DIESE Aufgabe überhaupt nicht.



  • hallo,

    ja, das hätte ich aber viiiieeeel besser gemacht... (nur ironisch gemeint)

    mfg
    murph



  • JFK schrieb:

    Man muß prüfen, welcher String von beiden größer ist.

    Hm?
    Wenn ich das richtig versteh, was du meinst, und was er meint, is doch des wurscht, ob ich mit dem größeren oder dem kleineren anfang das zu vergleichen, weil ja die n gleichen Zeichen in beidem enthalten sein müssen.



  • In diesem Fall ist es so.
    Es ist wurscht, ob ich die wenigen Möglichkeiten des kurzen Strings mit den vielen Möglichkeiten des langen vergleiche oder die vielen des langen mit den wenigen des kurzen.

    Wenn die Länge der Übereinstimmung nicht bekannt ist, macht es Sinn, den kürzeren als Quelle nehmen, um zu vermeiden, dass Quellstring länger ist als der zu prüfende.
    Ist eigentlich aber auch wurscht, weil ich in beiden Fällen prüfen muss, ob ich am Ende bin, oder ?



  • Markus Pelloth schrieb:

    auch auf die Gefahr hin, dass es jetzt gleich alle besser können 🙂

    Wenn's weiter nichts ist. 😉

    bool PartialMatch(String str1, String str2, int MinMatch)
    {
      bool result = false;
    
      String strShort = str1, strLong = str2;
      if (str1.Length() >= str2.Length())
        strShort = str2, strLong = str1;
    
      if (MinMatch > strShort.Length())
        MinMatch = strShort.Length();
    
      for (int i = MinMatch; i >= 0; i--)
      {
        if (!strLong.Pos(strShort))
          strShort.Delete(1, 1);
        else
        {
          result = true;
          break;
        }
      }
      return result;
    }
    

    Es wird geprüft, ob der kürzere String im längeren enthalten ist. Wenn nicht dann wird das erste Zeichen des kürzeren Strings entfernt und die Prüfung wiederholt. Das Ganze solange, bis Länge des kürzeren Strings die angegebene Mindestzahl an übereinstimmenden Buchstaben erreicht hat.



  • Also, das klappt nicht so recht.

    1. Wenn die Strings gleich lang sind findet er manchmal nix (ich lass bei meinen Eingabefenstern nur Edit1 und Edit2 drin stehen). Erst wenn ich bei einem die Zahl wegnehme.

    2. Dann findet er aber nur eine Übereinstimmung, wenn MinMatch auf 3 gesetzt wurde. Es gibt aber 2 ("Edi" und "dit").
    Oder prüf mal "Bella Bella Bella" mit "bla Bella Bella". Da findet mein Beispiel 30 Übereinstimmungen bei einer Stringlänge von 3. Deins findet 1 ("la Bella Bella").

    Aber ich glaub, da kommt es auch auf die genaue Aufgabenstellung an: Will er alle Übereinstimmungen ab einer bestimmten Länge oder grundsätzlich eine Meldung, wenn er eine findet.


Anmelden zum Antworten