Stringverarbeitung



  • Hallo,

    ich habe ein kleines Problem mit den String:

    Und zwar möchte ich schauen ob ein bestimmtes Wort in einen String vorkommt, dann das Wort dahinter verändern und als neuen String speichern.

    Hat jemand eine Idee, wie mann dies "schnell und unkompliziert" erliedigen kann?

    Gruß
    Michael



  • Hi,

    schau dir mal die Hilfe zum Thema AnsiString an. Zumindest die Memberfunktion Pos.



  • Habe ich Methode

    AnsiContainsStr("hallo","ha");

    gefunden(in der Hilfe von Borland),
    aber wenn ich Sie benutzen will, sagt er immer, dass er die Funktion nicht kennt??????

    Muß ich da noch was includen?



  • Probiere es mal mit "Pos" aus:

    String HelloWorld = "HelloWorld";
    int AnWelcherPosition;
    
    AnWelcherPosition = HelloWorld.Pos("W"); //Suche nach "W" und gib Position an
                                             //Integer Variable zurück.
    //Ergebnis: AnWelcherPosition = 6
    

    CU



  • Weshalb gibt es eigentlich bei C++ StrStr wenn es schon Pos gibt?
    StrStr hat bei mir noch nie richtig funktioniert. Mal findet er - mal findet er nicht. 😕



  • Oh Entschuldigung AndreasW!
    Ich glaub jetzt hab ich den "Lern-Effekt" genommen. 😞



  • @Andist: Die korrekte Frage müsste lauten: Warum gibt es in der VCL/CLX eigentlich AnsiString::Pos() wenn es doch in C/C++ schon strstr() gibt?

    Ganz einfach: strstr() kennt logischerweise AnsiString nicht und AnsiString::Pos() ist einfacher zu handhaben.

    [ Dieser Beitrag wurde am 04.05.2003 um 17:36 Uhr von Eßer editiert. ]



  • Die Korrekte begründung ist, dass strstr C und nicht C++ ist und ausserdem zur Verarbeitung von AnsiStrings in C mit char-Array-Zeigern gearbeitet werden müsste, was dazu führt, dass ein interner Zeiger freigegeben werden muss, was immer wieder kritisch ist.

    -junix



  • Hallo

    Schau auch mal hier: http://bcb-tutorial.c-plusplus.net/



  • @junix: Wenn wir schon beim Klugscheißen sind, dann auch richtig. 😉

    Ich habe bewusst weder C noch C++ gesagt, sondern C/C++.

    Denn die Hilfe sagt eindeutig:

    char *strstr(const char *s1, const char *s2);                /* nur C */
    const char *strstr(const char *s1, const char *s2);          // nur C++
    char *strstr(char *s1, const char *s2);                      // nur C++
    

    Ansonsten ist deine Begründung natürlich auch richtig. 🙂

    [ Dieser Beitrag wurde am 05.05.2003 um 15:44 Uhr von Eßer editiert. ]



  • btw wenn ich euch mal eben kurzz beim Klug******* unterbrechen dürfte 🙄 : AnsiContainsStr benötigt genau wie die meisten komplexeren Stringmanipulationsmethoden StrUtils.hpp
    deshalb kennt er das nicht.

    [ Dieser Beitrag wurde am 06.05.2003 um 08:08 Uhr von dreaddy editiert. ]



  • *g*

    ihr seit ein paar Nasen 😃 🙂



  • AnsiContainsStr ist bei bcb5pro noch nicht dabei und die sysutils.hpp ist bereits in der vcl.h inkludiert!



  • Wie kann ich jetzt beispielsweise eine Suche mit "Pos" wiederholen?
    In der Hilfe steht das Beispiel...

    AnsiString  S = "   123.5";
    int p;
     // Leerzeichen in Nullen konvertieren 
    while ((p = S.Pos(' ')) > 0 )
      S[p] = '0';
    

    Funktioniert ja auch recht gut. Nur...
    wenn ich nun diese Funktion etwas umbaue, so das mir das Programm den Dateipfad angibt, läuft mir der Compiler in eine Endlos-Schleife:

    AnsiString Datei = Application->ExeName;
    String Pfad;
    int p;
    while ((p = Datei.Pos('\')) > 0 )
    Pfad = Datei[p];

    😕



  • Und dies hier wiederholt die ganze Sache leider nicht:

    String  Datei = Application->ExeName;
    String Pfad;
    int p;
    int w = 0;
    while ((p = Datei.Pos('\\')) > 0 && w<Datei.Length())
    {
      Pfad = Datei;
      Pfad.SetLength(p);
      w++;
    }
    //Das Programm hört nach dem ersten "Fund" auf.
    


  • Ich blick nicht durch...... Was soll dir die Schleife bringen?
    Ich meine Pfad ist doch immer gleich ( da sich "p" ja nicht verändert, da du ja
    an "Datei" auch nichts änderst??? ).........
    MFG Aoeke

    [ Dieser Beitrag wurde am 05.05.2003 um 19:23 Uhr von Aoeke editiert. ]



  • Ach so, also...

    Application->ExeName ist doch der Dateinamen der *.exe: Bsp.: C:\Eigene Dateien\Projekt1.exe

    Wenn ich jedoch den Pfad haben möchte:
    C:\Eigene Dateien\

    Also muss ich doch nach dem letzten "\" suchen und alles was dannach noch folgt untern Tisch fallen lassen.
    Oder gibt es da eine leichtere Variante?



  • mensch mensch mensch... nimm mal das brett vor deinem kopf weg!

    bcb starten, F1 drücken, ExtractFilePath oder ExtractFileDir eintippen, und lesen was da steht!

    p.s. nächstes mal gleich kopf einschalten...



  • Das geht ja einfach! 🙄

    Danke!



  • Original erstellt von Sunday:
    AnsiContainsStr ist bei bcb5pro noch nicht dabei und die sysutils.hpp ist bereits in der vcl.h inkludiert!

    also bei mir ist:

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      AnsiContainsStr("hallo", "ha");
    }
    
    [C++ Fehler] Unit1.cpp(20): E2268 Aufruf der undefinierten Funktion 'AnsiContainsStr'
    

    im Gegnsatz dazu läuft

    #include "StrUtils.hpp"
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      AnsiContainsStr("hallo", "ha");
    }
    

    problemlos durch, könnte dadran liegen das Sysutils != StrUtils 😛

    Ausserdem hat er die Methode wie er schreibt in der Hilfedatei gefunden(ich denke mal in seiner) also hat er auch BCB6.

    [ Dieser Beitrag wurde am 06.05.2003 um 08:16 Uhr von dreaddy editiert. ]


Anmelden zum Antworten