Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Textsuchfunktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.03.2004, 20:56 Uhr
Anfänger00



Ich habe eine suchfunktion programmiert,(ist momenrtan noch keine Funktion,sondern besteht aus mehreren schleifen in einer Hauptschleife)
mit der man Worte in einem String oder einer textdatei suchen kann.
Dabei muss das Suchwort im Text nicht zusammenhängen sondern kann
auch von leerzeichen oder anderen Zeichen unterbrochen werden.
Das Problem liegt dabei,dass die Positionsangabe der einzelnen Zeichen nicht stimmt:

C++:
#include <iostream>
#include <conio.h>

using namespace std;

int mystrlen(const char* buffer);

int main()
{
  char text[] = "abcdefghijklmnopqrstuvwxyzz";

  int i = 0;
  int anzahl = 0;//
  char suchwort[256];
  int p = 0;
  int pruef2 = 0;
  int x;

  cout << "Gesuchtes Wort eingeben: ";
  cin >> suchwort;
  const int groesse = mystrlen(suchwort);
  int pruef = groesse;
  int a[groesse * 1000];

  while(true)
  {
    for(i = 0; i < groesse; i++)
    {
      if(text[i + p] == suchwort[ i ])
      {
        pruef2++;
        break;
      }
      else
      {
        x = 0;
        while(true)
        {
          p++;
          x++;
          if(text[i + p] == suchwort[ i ])
          {
            pruef2++;
            a[i + anzahl] = p;
            break;
          }
        }
      }
    }

    if(pruef == pruef2)
    {
      anzahl++;
      p += groesse - 1;
      pruef2 = 0;
      if(text[p + groesse - 1] == '\0')
      {
        break;
      }
    }
    p++;
    pruef2 = 0;
    if(text[p + groesse - 1] == '\0')
    {
      break;
    }
  }

  cout << "Das gesuchte Wort wurde " << anzahl << " mal gefunden!\n";
  cout << "Tabelle der Positionenn";
  cout << "Wort           |  von |  bis\n\------------------------------------------\n";
  for(int i = 0; i < anzahl; i++)
  {
    cout << suchwort << "\t  ";
    for(int j = 0; j < groesse; j++)
    {
      if(j == 0)
      {
        cout << a[i + j];
      }
      else
      {
        cout << "-" << a[i + j];
      }
    }//for
  }
  getch();
}

int mystrlen(const char* buffer)
{
  int x=0;
  while(buffer[x] != '\0') x++;
  return x;
};



Findet ihr meinen Fehler?

Im Voraus dankt Anfänger++


Bearbeitung von 0xdeadbeef:

Ich hab mir die Freiheit genommen, den Code lesbarer zu formatieren.


Dieser Post wurde am 04.03.2004 um 23:14 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.03.2004, 23:22 Uhr
0xdeadbeef
Gott
(Operator)


Mir ist irgendwie schon garnicht klar, wie dein Algorithmus funktionieren soll. Erklär doch mal in Worten, was das Programm eigentlich genau machen soll. Mit einer ziemlich unübersichtlichen, fehlerhaften, unkommentierten Code-Datei kann ich nicht viel anfangen.


Bearbeitung:

Mit "genau" meine ich "ganz genau", also wie das Programm das erreichen soll, was es erreichen soll


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 04.03.2004 um 23:23 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.03.2004, 09:53 Uhr
Anfänger00



Also man gibt das Suchwort ein,das dann als char gespeicher wird.
Dann wird der text Zeichen für Zeichen durchgegangen und überprüft,
ob das Wort im Text vorkommt.
Es kann aber auch sowas gefunden werden:

C++:
char text []="abcdefghijklmnopqrstuvwxyz";
Suchwort []="acgy"

Suche(text,Suchwort);



Jetzt soll es aber noch die postion der einzelnen (gefunden) zeichen ausgeben.
Und dass funktioniert noch nicht so ganz,eigentlich überhaupt nicht.

Dieser Post wurde am 06.03.2004 um 09:56 Uhr von Anfänger00 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.03.2004, 14:07 Uhr
Oliver
S2-Pixelgeneral


Also bei mir geht das Programm gar nicht zum kompilieren (vc++ 6.0):


Code:
c:\programme\microsoft visual studio\my projects\konsolenversuch\asdfgsdf.cpp(23) : error C2057: expected constant expression
c:\programme\microsoft visual studio\my projects\konsolenversuch\asdfgsdf.cpp(23) : error C2466: cannot allocate an array of constant size 0
c:\programme\microsoft visual studio\my projects\konsolenversuch\asdfgsdf.cpp(23) : error C2133: 'a' : unknown size
c:\programme\microsoft visual studio\my projects\konsolenversuch\asdfgsdf.cpp(71) : warning C4129: '-' : unrecognized character escape sequence
c:\programme\microsoft visual studio\my projects\konsolenversuch\asdfgsdf.cpp(72) : error C2374: 'i' : redefinition; multiple initialization
        c:\programme\microsoft visual studio\my projects\konsolenversuch\asdfgsdf.cpp(12) : see declaration of 'i'
c:\programme\microsoft visual studio\my projects\konsolenversuch\asdfgsdf.cpp(88) : warning C4508: 'main' : function should return a value; 'void' return type assumed





C++:
int a[groesse * 1000];



Sowas geht nicht, dynamischen Speicher musst du mit new/delete bzw. malloc()/free() allocieren:


C++:
int a;
a=new int[groesse*1000];



und dann am Ende natürlich wieder freigeben:


C++:
delete [] a;



Dann würd ich const bei groesse wegmachen, groesse ist keine Konstante.

Außerdem solltest du ein return einfügen!

Das wars auch schon. :D
Ansonsten blick ich von der Logik her ebenfalls nicht durch, du solltest den Quellcode wirklich mal kommentieren, sonst kapiert das kein Mensch. :!:
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )

Dieser Post wurde am 07.03.2004 um 19:00 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.03.2004, 18:47 Uhr
Cebinem



Also, die Fehler, die ich gefunden habe sind folgende:

1.
In der Zeile

C++:
const int groesse = mystrlen(suchwort);



muss das const weg (wie schon von Oliver Müller gesagt).

2.
Die Zeile

C++:
int a[groesse * 1000];



erwartet einen Wert.

3.
Die Zeile

C++:
cout << "Wort           |  von |  bis\n\------------------------------------------\n";


ist ungültig, da sie die ungültigen Zeichen (-----------------------------) enthält, mach die weg.


4.
Die Zeile

C++:
for(int i = 0; i < anzahl; i++)



wurde ein Neudefinition und eine Mehrfachinitialisierung von i vorgenommen, dies stimmt nicht mit der Zeile

C++:
int i = 0;



überein, weil der Wert vin i nicht 0 ist.

Ich gebe keine Garantie auf die Richtigkeit meiner Aussagen.


Ich hoffe, ich konnte helfen!

MFG
Cebinem

Bearbeitung von Pablo:

Du hast vergessen, ein CPP Tag zu schließen.


--
Jetzt sind wir hier, was jetzt geschieht, geschieht uns. - Anna Seghers

Dieser Post wurde am 07.03.2004 um 19:03 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.03.2004, 19:14 Uhr
Anfänger00



So jetzt mit Kommentaren zur bessdern Verständlichkeit:

C++:
#include <iostream>
#include <conio.h>
using namespace std;
int mystrlen(const char* buffer);
int main()
{
char text[]="abcdefghijklmnopqrstuvwxyzz";

int i=0;              
int anzahl=0;// Anzahl,wie oft das Wort gefunden wurde
char suchwort[256];
int  p=0;// p gibt an, an welcher Position gesucht wird
int pruef2=0;
int x;

cout<<"Gesuchtes Wort eingeben: ";
cin>>suchwort;

const int groesse=mystrlen(suchwort); //in groesse wird die Länge des Suchwortes gespeichert
int pruef=groesse;                    
int a[groesse*1000]; //in a werden die positionen der gefundenen
//Buchstaben gespeichert

while(true)
{
for(i=0;i<groesse;i++) //In dieser For-Schleife wird der Text:
{                      //1.Durchlauf:von null bis Länge des Suchwortes
                       //            durchsucht....
                       //2.Durchlauf:von 1-bis Länge des Suchwortes
if(text[i+p]==suchwort[i])
{pruef2++;break;}         //pruef2 wird erhöht,damit bei if(pruef==pruef2)
                          //überprüft werden kann,ob z.B bei einem Wort mit der
                          //Länge von 5 Buchstaben auch 5 in der richtigen Reihenfolge
                          //gefunden wurden
else //Damit nun aber auch Wörter gefunden werden können,die versteckt sind,
{    //gibt es diese else-Anweisung. Beispiel: gesucht:xxy; im Text: x%xy;
     // -> wird trotzdem gefunden
x=0;
    while(true) // ich glaube in dieser while-S. liegt der Fehler!!!!
    {   p++;
        x++;  
        if(text[i+p]==suchwort[i])
        {pruef2++; a[i+anzahl]=p; p=p-(x-1); break;} //hier muss was geändert werden!
    }//Fehler
}

}//for

if(pruef==pruef2)
{
anzahl++;
p+=groesse-1;
pruef2=0;
if(text[p+groesse-1]=='\0')
{break;}
}
p++;
pruef2=0;
if(text[p+groesse-1]=='\0')
{break;}

}//ende der großen while-Schleife

//Ausgabe..........

cout<<"Das gesuchte Wort wurde "<<anzahl<<" mal gefunden!\n";
cout<<"Tabelle der Positionen:\n";
cout<<"Wort           |  von |  bis\n\
------------------------------------------\n"
;
for(int i=0;i<anzahl;i++)
{
cout<<suchwort<<"\t  ";
for(int j=0;j<groesse;j++)
{

if(j==0)
{cout<<a[i+j];}
else
{cout<<"-"<<a[i+j];}

}//for

}
getch();
}

int mystrlen(const char* buffer) //Funktion um die Größe eines
//Strings  festzustellen
{
    int x=0;
    while(buffer[x] != '\0')x++;
    return x;
};


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.03.2004, 16:41 Uhr
Oliver
S2-Pixelgeneral


Alle so erstens ist das Programm von der Syntax schon nicht richtig und zweitens, wo ich es dann verbessert hatte, kam nichts Gescheites dabei heraus.

Ich habe mal selber ein Programm geschrieben, das findet allerdings das Wort nur einmal, aber mit x Zeichen dazwischen:


C++:
#include <iostream>
#include <fstream>
#include <string>
#include <list>

using namespace std;

// Struktur für jedes gefundene Zeichen
struct gefundene_Zeichen
{
    int pos_text;
    char name;
    int pos_suchstr;
};


int main()
{
    // in text wird der Text gespeichert, in dem das Suchwort gesucht werden soll
    string text;
    // hier wirde das gesuchte Wort gespeichert
    string suchstring;
    // im foundindex speichern wir, welches Zeichen aus dem "suchstring" wir gerade suchen müssen
    int foundindex=0;
    // die Längen von den beiden Strings
    int text_length;
    int suchstr_length;
    // In der foundlist werden die gefundenen Buchstaben gespeichert
    list<gefundene_Zeichen> foundlist;
    // Iterator zur foundlist
    list<gefundene_Zeichen>::iterator it;
    // hier speichern wir die Struktur, damit wir sie zur Liste hinzufügen können
    gefundene_Zeichen temp;
    // erklärt sich von selbst
    ofstream out;

    // Eingaben vom Anwender holen
    cout << "Bitte geben Sie ein Text ein, in dem das Suchwort gesucht werden soll (bitte ohne Leerzeichen): ";
    cin >> text;
    cout << "Geben Sie jetzt das gesuchte Wort ein: ";
    cin >> suchstring;

    // Längen bestimmen
    text_length=text.length();
    suchstr_length=suchstring.length();

    // In dieser Schleife werden die Buchstaben gesucht
    // die Schleife muss abgebrochen werden, wenn die text_length überschritten ist
    // und wenn der foundindex über oder gleich der Länge des Suchstrings liegt
    for(int i=0;i<text_length&&foundindex<suchstr_length;++i)
    {
        // Das Zeichen wurde gefunden
        if(text[i]==suchstring[foundindex])
        {
            // wir füllen die Struktur mit den benötigten werden
            temp.name=suchstring[foundindex];
            temp.pos_suchstr=foundindex;
            temp.pos_text=i;
            // das temp an die Liste hinzufügen
            foundlist.push_back(temp);
            // der foundindex muss erhöht werden, da das
            // nächste Zeichen gesucht werden muss
            ++foundindex;
        }
    }

    out.open("ergebnis.txt");
    out << "Suchergebnis: \n\n";
    out << "Das Wort \"" << suchstring << "\" wurde im Wort \"" << text << "\" gesucht werden.\n\n";

    // wenn die anzahl der gefundenen Zeichen (ermittelt mit foundlist.size()) gleich der Länge des
    // gesuchten Wortes ist, dann worden die gesamten Zeichen gefunden
    if(suchstr_length==foundlist.size())
    {
        out<<"Das Wort wurde gefunden und zwar an folgenden Stellen: \n\n\n";
        // Nun geben wir alles aus
        for(it=foundlist.begin();it!=foundlist.end();it++)
        {
        out << "Buchstabe: " << it->name << "\n";
        out << "Position im Suchwort: " << it->pos_suchstr << "\n";
        out << "Position im Text, der durchsucht werden sollte: " << it->pos_text << "\n\n";
        }
    }
    else
    {
        out<<"Das Wort wurde nicht gefunden.";
    }

    
    out.close();


    cin.get();
    return 0;
}


--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.03.2004, 20:50 Uhr
~franko
Gast


Warum probierst du nicht mal sowas mit ser STL von C++.
Da kann man sowas ganz bequem mit find lösen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.03.2004, 16:20 Uhr
Anfänger00



Also wenn du mit syntax meinst,dass es nicht compilierbar ist,dann muss
sagen dass das mit dem Dev-cpp Compiler(ja,ich weiß das ist nur die IDE)
geht.Ihr habt ja auch beide Recht,ich sollte mal die STL lernen und das Programm von Oliver ist ja auch viel besser strukturiert.
Also danke für eure Belehrungen und die Lösung.(das ist natürlich keine Hausaufgabe gewesen ,welcher Lehrer würde sich schon so nen Schrott ausdenken?)

Dieser Post wurde am 09.03.2004 um 16:24 Uhr von Anfänger00 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: