Announcement

Collapse
No announcement yet.

Suchen funktion

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Suchen funktion

    Ich hab ein problem.. ich weiß blos nicht welches!<BR>
    ich will einen text durchsuchen(siehe unten)<BR>
    aber wenn.., ja er packts nicht so ganz..<BR>
    <BR>
    bsp: (var wird gesucht)<BR>
    var //erkennt er perfekt<BR>
    <BR>
    dgvar //erkennt er nicht<BR>
    <BR><BR>
    dgvardg //erkennt er perfekt<BR>
    <BR><BR>
    vardg //erkennt er perfekt<BR>
    var //hier stuerzt er ab.. aber wieso???<BR>
    <BR>
    kann mir jemand helfen?<BR>
    <BR>
    <U>Hier der Code:</U><BR>
    //schon Vorher:<BR>
    //CSuche DlgSuch;<BR>
    //DlgSuch.m_grosklein = ob gorß/klein unterscheiden (bool)<BR>
    //DlgSuch.m_wort = das gesuchte word (CString)<BR>
    <BR>
    //CPoint sp;<BR>
    //sp.x=0<BR>
    //sp.y=-1<BR>
    <BR>

    <BR><BR>
    void CColorEditDlg::OnDateiWeitersuchen()<BR>
    {<BR>
    <BR>
    CString buff = "";<BR>
    while ( ( (/**/(!DlgSuch.m_grosklein)&&((buff.Mid(sp.x,(DlgSuch.m _wort).GetLength())).CompareNoCase(DlgSuch.m_wort) !=0 )/**/)||(/**/(DlgSuch.m_grosklein)&&((buff.Mid(sp.x,(DlgSuch.m_ wort).GetLength())).Compare(DlgSuch.m_wort)!=0 )/**/))&&( sp.y< m_pColorWnd->GetLineCount()-1/*Bsp: beim 3 zeiligen text nicht in zeile 5 suchen*/ ) )<BR>
    {sp.x++;<BR>
    if (sp.x>=buff.GetLength()-(DlgSuch.m_wort).GetLength()){<BR>
    sp.y++;<BR>
    buff = m_pColorWnd->GetLine(sp.y);//ladet neue zeile<BR>
    sp.x=0;<BR>
    }}<BR>
    <BR>
    if ( (buff.Mid(sp.x,(DlgSuch.m_wort).GetLength())).Comp areNoCase(DlgSuch.m_wort)==0 ){<BR>
    m_pColorWnd->SetSelection(buff.Find(DlgSuch.m_wort),sp.y,(DlgS uch.m_wort).GetLength()+buff.Find(DlgSuch.m_wort), sp.y);//makiert stelle<BR>
    m_pColorWnd->SoftScrollToLine(sp.y);//scrollt an markierte stelle<BR>
    }else{<BR>
    MessageBox(DlgSuch.m_wort+"\nkonnte nicht gefunden werden!");}<BR>
    }<BR>
    <BR>
    <BR>

  • #2
    hi Daniel W.,<P>
    ich hab mir dein code nicht genau angeschaut (bei dem while() wird mir ganz schwindlig ).<BR>
    aber hab ich es richtig verstanden, das du in einem text das vorhandensein eines wortes suchst?<BR>
    wenn ja, haette ich eine non-case-sensitive vergleichsfunction fuer dich, die noch aus meiner schulzeit stammt und die ich auch heute noch einsetze.<P>
    gruss roy

    Comment


    • #3
      Das klingt gut..<br>
      Mein while() müsste eigentlich stimmen, aber der rest??<br>
      In der Entwicklungs-umgebung sieht das alles übersichtlicher aus..<br>
      Für den code wär ich sehr dankbar, wird mir warscheinlich helfen!<br>
      case-sensitive bau ich dann halt dran..<br>
      Danke für deine Hilfe, und schon mal danke für den code

      Comment


      • #4
        ok, hier die funktion. an die funktion werden char-pointer uebergeben.<BR>
        ob das auch mit CString geht, musst du ausprobieren oder das einlesen der feldtexte an char-pointer uebergeben.<P>

        <PRE>
        #include <stdio.h>

        //bei verwendung anderer compiler als ms-vs
        //#include <stdlib.h>
        //#include <ctype.h>
        //#include <string.h>

        ...
        ...
        ...

        int isInString(char *dest_str, char *search_str)
        {
        //non-case-sensitive vergleichsfunction:
        //in dest_str wird das vorkommen von search_str uebergeprueft.
        //bei uebereinstimmung wird 1 zurueckgegeben
        //bei nichtuebereinstimmung wird 0 zurueckgegeben

        char *str1;
        char *str2;
        int str_len, i;

        //1ter string
        if(dest_str == NULL)
        return(0);

        str_len = strlen(dest_str);

        //allokier mal die laenge + abschliessendes zeichen
        str1 = new char [str_len+1];//+1 fuer '\0'

        //mach string mal pauschal gross
        //mach zeichenweise toupper (1. string)
        for(i=0; i<=str_len-1; i++)
        {
        //ist kleinbuchstabe?
        if(((*(dest_str+i)) >= 'a') &&
        ((*(dest_str+i)) <='z'))
        str1[i]=toupper(*(dest_str+i)); //dann mache das aktuelle zeichen gross
        //ist umlaut?
        else if(((*(dest_str+i)) >= 'ä') || //oder
        ((*(dest_str+i)) >= 'ö') || //oder
        ((*(dest_str+i)) >= 'ü'))
        str1[i]=toupper(*(dest_str+i)); //dann mache das aktuelle zeichen gross
        else
        str1[i]=(*(dest_str+i)); //ansonsten uebernimm das aktuelle zeichen, wie es ist
        }
        str1[i]='\0';//beende 1.string, oder vorher memset()

        //2ter string
        str_len=strlen(search_str);

        //allokierung
        str2=new char [str_len+1];//+1 fuer '\0'

        //mach zeichenweise toupper (2. string)
        for(i=0; i<=str_len-1; i++)
        {
        //ist kleinbuchstabe?
        if(((*(search_str+i)) >= 'a') &&
        ((*(search_str+i)) <='z'))
        str2[i]=toupper(*(search_str+i)); //dann mache das aktuelle zeichen gross
        //ist umlaut?
        else if(((*(search_str+i)) >= 'ä') || //oder
        ((*(search_str+i)) >= 'ö') || //oder
        ((*(search_str+i)) >= 'ü'))
        str2[i]=toupper(*(search_str+i)); //dann mache das aktuelle zeichen gross
        else
        str2[i]=(*(search_str+i)); //ansonsten uebernimm das aktuelle zeichen, wie es ist
        }
        str2[i]='\0';//beende 2.string

        //vergleiche
        if(strstr(str1,str2) != NULL)
        {
        delete [] str1;//allokierung wird freigegeben
        delete [] str2;
        return(1);//str2 ist in str1 enthalten
        }

        return(0);//keine uebereinstimmung
        }
        </PRE>
        <P>
        das sieht jetzt ein bisserl viel aus, aber denk dir die kommentare weg.<P>
        gruss roy<BR&gt

        Comment


        • #5
          Super, Danke!<br>
          das hilft mir weiter

          Comment


          • #6
            .. es hilf doch nicht....<br>
            trotzdem danke<br>
            aber ich bin ein kleines stück weiter gekommen..<br&gt

            Comment


            • #7
              ha! ich habs geschafft!! prob gelöst..

              Comment

              Working...
              X