tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
1142
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Tasm-Devil
    Tasm-Devil Tasm-Devil ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Maxdorf
    Beiträge
    137
    Hallo Leute ich habe ein Problem. Und zwar kenne ich mich überhaupt nicht mit der string.h aus. Ich kann nich gescheid mit Strings vom Typ char * umgehen.
    Nun habe ich folgendes Problem. Ich möchte aus einer html-datei alle E-Mail-adressen kopieren. Es soll ein ganz kleines Programm werden.
    1. Suche nach "mailto:"
    2. kopiere alles was danachkommt.
    3. Höre bei ".de" auf zu kopieren.
    (4. alles wird am ende aufgelistet)

    so weit bin ich gekommen:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    /* Datei laden*/
          iFileHandle = FileOpen("baden.txt", fmOpenRead);
          iFileLength = FileSeek(iFileHandle,0,2);
          FileSeek(iFileHandle,0,0);
          char *pszBuffer;
          pszBuffer = new char[iFileLength+1];
          iBytesRead = FileRead(iFileHandle, pszBuffer, iFileLength);
          FileClose(iFileHandle);
    /* inhalt ist in pszBuffer gespeichert */
     
          char suchString1 []= "mailto:";
          char *tempString1;
          tempString1 = strstr (pszBuffer, suchString1)+7;
          char suchString2 []= ".de";
          char *tempString2;

    ich weiß das ist nicht viel aber vieleicht kann mir ja einer helfen.
    Danke.
     
    C macht es einfach, sich in den Fuß zu schießen; C++ erschwert es, aber wenn man es tut, bläst es einem das ganze Bein weg." —Bjarne Stroustrup .-.-.-.-.-.-.
    „Ich habe mir immer gewünscht, dass mein Computer so einfach zu bedienen sein sollte wie mein Telefon. Mein Wunsch wurde wahr. Ich weiß nun nicht mehr, wie mein Telefon funktioniert.“ —Bjarne Stroustrup

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Bevor du den Rückgabewert der strstr Funktion verwendest mußt du auf jeden Fall erstmal überprüfen ob nicht NULL zurückgeliefert wurde.

    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    char* pos = strstr(pszBuf, "mailto:");
    if (pos != NULL) {
      pos += strlen("mailto:");
      char* end = strstr(pos, ".de");
      if (end != NULL) {
        int len = end - pos + strlen(".de");
        char* dest = new char[len+1];
        strncpy(dest, pos, len);
        dest[len] = '\0';
        ...
        delete[] dest;
      }
    }
    Das Ganze mußt du dann natürlich in eine Schleife packen. Und nicht vergessen pszBuf mit delete[] freizugeben.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von Tasm-Devil
    Tasm-Devil Tasm-Devil ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Maxdorf
    Beiträge
    137
    Also vielen Dank erst mal. Das hat mich weiter gebracht. Aber jetzt tritt ein neues Problem auf. Und zwar ist die TLD nicht immer .de sondern auch .net oder .com

    Hier ist mein bisheriger code
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
          iFileHandle = FileOpen("baden.txt", fmOpenRead);
          iFileLength = FileSeek(iFileHandle,0,2);
          FileSeek(iFileHandle,0,0);
          char *pszBuffer;
          pszBuffer = new char[iFileLength+1];
          iBytesRead = FileRead(iFileHandle, pszBuffer, iFileLength);
          FileClose(iFileHandle);
          char* pos;
          int counter = 0;
          AnsiString result[100]; // nur profesorisch, wird noch mithilfe von new verbessert
          do
          {
          pos = strstr(pszBuffer, "mailto:");
                if (pos != NULL)
                {
                pos += strlen("mailto:");
                pszBuffer = pos;
                char* end = strstr(pos, ".de");  //hier muss auch nach .net und .com geprüft warden
                      if (end != NULL)
                      {
                      int len = end - pos + strlen(".de");
                      char* dest = new char[len+1];
                      strncpy(dest, pos, len);
                      dest[len] = '\0';
                      result[counter++] = dest;
                      delete[] dest;
                      }
                }
          }
          while (pos != NULL);
     
          // now display it
          counter = 0;
          ListBox1->Clear();
          while (result[counter] != NULL) // fehler (counter schießt über das ende von result hinaus.
          {
          ListBox1->Items->Add(result[counter++]);
          }
     
    C macht es einfach, sich in den Fuß zu schießen; C++ erschwert es, aber wenn man es tut, bläst es einem das ganze Bein weg." —Bjarne Stroustrup .-.-.-.-.-.-.
    „Ich habe mir immer gewünscht, dass mein Computer so einfach zu bedienen sein sollte wie mein Telefon. Mein Wunsch wurde wahr. Ich weiß nun nicht mehr, wie mein Telefon funktioniert.“ —Bjarne Stroustrup

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Tasm-Devil
    Also vielen Dank erst mal. Das hat mich weiter gebracht. Aber jetzt tritt ein neues Problem auf. Und zwar ist die TLD nicht immer .de sondern auch .net oder .com
    Das ist natürlich schlecht mit deinem bisherigen Ansatz, weil vermutlich in jeder HTML .net .de bzw. .com drinsteht. Du müßtest halt schauen welches von den interessanten Endungen zuerst kommt.

    So richtig wird das natürlich dann auch nicht funktionieren weil es noch viele andere Endungen gibt usw. Besser wäre natürlich das Dokument zu parsen und in href Attributen die mailto: Adressen auszulesen.

    Zitat Zitat von Tasm-Devil
    Code :
    1
    
                pszBuffer = pos;
    Du darfst den Wert des Zeigers pszBuffer nicht überschreiben (wenn du ihn nicht nochmal irgendwo extra gesichert hast) weil du den Speicher ohne die Adresse sonst nicht mehr freigeben kannst. Das nennt man Speicherleck.

    Du hast übrigens vergessen den Speicher mit delete[] freizugeben.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Avatar von Tasm-Devil
    Tasm-Devil Tasm-Devil ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Maxdorf
    Beiträge
    137
    so jetzt bin ich fertig.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    
    void __fastcall TForm1::OpenBtnClick(TObject *Sender)
    {
      if(OpenDialog1->Execute() == true)
      {
      iFileHandle = FileOpen(OpenDialog1->FileName, fmOpenRead);
      iFileLength = FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
      pszBuffer = new char[iFileLength+1];
      iBytesRead = FileRead(iFileHandle, pszBuffer, iFileLength);
      FileClose(iFileHandle);
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::searchBtnClick(TObject *Sender)
    {
    char* pos;
    int counter = 0;
    AnsiString result[100];
      do
      {
      pos = strstr(pszBuffer, "mailto:");
        if (pos != NULL)
        {
        pos += strlen("mailto:");
        pszBuffer = pos;
        char* end_de = strstr(pos, ".de");
        char* end_net = strstr(pos, ".net");
        char* end_com = strstr(pos, ".com");
          if (end_de != NULL || end_net != NULL || end_com != NULL)
          {
          int len = 0;
            if(end_de != NULL)
            len = end_de - pos + strlen(".de");
            if (len > 50 && end_net != NULL)
            len = end_net - pos + strlen(".net");
            if (len > 50 && end_com != NULL)
            len = end_com - pos + strlen(".com");
          char* dest = new char[len+1];
          strncpy(dest, pos, len);
          dest[len] = '\0';
          result[counter] = dest;
          counter++;
          delete[] dest;
          }
        }
      }
      while (pos != NULL);
    delete[] pos;
    delete[] pszBuffer;
    // now display it
    counter = 0;
    Memo1->Clear();
      while (result[counter] != "")
      {
      Memo1->Lines->Add(result[counter]);
      counter++;
      }
      Label1->Caption = IntToStr(counter) + " E-Mail-adressen gefunden.";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::SaveBtnClick(TObject *Sender)
    {
      if(SaveDialog1->Execute() == true)
      Memo1->Lines->SaveToFile(SaveDialog1->FileName);
    }
    //---------------------------------------------------------------------------

    danke nochmal
     
    C macht es einfach, sich in den Fuß zu schießen; C++ erschwert es, aber wenn man es tut, bläst es einem das ganze Bein weg." —Bjarne Stroustrup .-.-.-.-.-.-.
    „Ich habe mir immer gewünscht, dass mein Computer so einfach zu bedienen sein sollte wie mein Telefon. Mein Wunsch wurde wahr. Ich weiß nun nicht mehr, wie mein Telefon funktioniert.“ —Bjarne Stroustrup

Ähnliche Themen

  1. [C++] strstr funktion const char problem
    Von elbdom im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 23.12.09, 14:20
  2. strstr() mit array
    Von Fat-Z im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 05.11.07, 08:39
  3. Antworten: 3
    Letzter Beitrag: 19.06.07, 16:42
  4. [c] problem mit strstr()
    Von norbert74 im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 29.08.05, 14:46
  5. strstr Fehler?
    Von mC pAiN im Forum PHP
    Antworten: 2
    Letzter Beitrag: 17.01.04, 12:40