Stringverarbeitung



  • 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