Kompliziertes durchsuchen eines strings!



  • hallo,

    ich lasse mir mit hilfe einer WinApi-Funktion alle Dateien/Ordner
    auflisten - fakt ist ich möchte eine Datei suchen!

    ich habe also Zugriff auf die Dateinamen und muss diese nun mit
    meinem Suchargument vergleichen und überprüfen ob was übereinsstimmt.

    mein suchargument kann allerdings auch so aussehen wie bei der
    windows-suche:

    *test*.txt
    

    ergebisse wären also z.B.

    Hallo[b]Test[/b]du[b].txt[/b]
    Wer[b]Test.txt[/b]
    [b]test.txt[/b]
    [b]test[/b]haha[b].txt[/b]
    

    wie kann ich also einen string so durchsuchen das er diese
    möglichkeiten findet? gibt es da "zufällig" bereits eine
    gegeignete string-funktionen?

    bin dankbar für rückmeldungen! 🙂



  • Im Standard gibt es das nicht - aber such mal nach "reguläre Ausdrücke" (oder "regular Expression")



  • Hallo,

    Was du suchst ist:

    find aus den C++-Strings

    http://www.cppreference.com/cppstring/index.html

    und FindFirstFile, FindNextFile

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/findfirstfile.asp

    Ich denke schon, dass es eine Biblothek dafür geben wird, aber ob du sie findest ist eine andere Sache. Ich kenne derzeit keine. Also bau dir selber einen Algorithmus, aber achte auf die Effizienz. Wenn du jedes Mal temporäre Objekte nur neue Variablen anlegst, wird es ziemlich kritisch 🙂

    MFG winexec*





  • ja super jetzt hab ich mich schon drangesetzt und hab ne
    funktion selber geschrieben 🙂

    int bs(char* src,char* search)
    {
    	int j=0;
    	int stlen_search=0;
    
    	for(int i=0;i<(int) strlen(search);i++)
    		if(search[i]!='*')
    			stlen_search++;
    
    	if(stlen_search>(int)strlen(src))
    		return 0;
    
    	for(i=0;i<(int)strlen(src);i++)
    	{
    		if(search[j]=='*')
    		{
    			while(src[i]!=search[j+1])
    			{
    				if(search[j+1]=='*')
    				{
    					j++;
    					continue;
    				}
    
    				i++;
    			}
    
    			i--;
    		}
    		else
    		{
    			if(src[i]<91 && src[i]>64 || src[i]<123 && src[i]>96)
    			{
    				if(search[j]<91 && search[j]>64 || search[j]<123 && search[j]>96)
    				{
    					if(src[i]!=search[j] && src[i]-32!=search[j] && src[i]!=search[j]-32)
    						return 0;
    				}
    				else
    					return 0;
    			}
    			else
    			{
    				if(search[j]<91 && search[j]>64 || search[j]<123 && search[j]>96)
    					return 0;
    				else
    				{
    					if(src[i]!=search[j])
    						return 0;
    				}					
    			}
    		}
    
    		j++;
    	}
    
    	return 1;
    }
    

    ich weis sie ist ein wenig lang aber für meine zwecke reichts ja.

    würd mich freuen wenn ihr sie mal ausprobieren und unter mängel
    nehmen würdet 😉

    also ausser übersichtlichkeit und schnelligkeit kann ich erstmal
    keine mängel entdecken 🙂

    wär aber auch net sauer wenn ihr nicht durch den code durchblickt erstmal 😃

    Beispiel:

    bs("HalloDu.txt","*allo*.txt");
    

    danke euch!



  • hmm wenn mein "suchstring" mit einem "*" beginnt wird
    alles wals wahr angeziegt :-|

    naja dann werde ich mich nun wohl der macht des "wildcmp"
    hingeben wie glob gepostet hat:

    http://www.codeproject.com/string/wildcmp.asp

    tschau 😉


Anmelden zum Antworten