suche "strstr" für Speicher, also "memstr"



  • Ok ich suche eine Funktion für Speicherblöcke die wie strstr für Srings funktioniert. Ich möcht z.B. die Zeichenfolge "\x00\x01\x00" in einem Speicherblock finden. Das geht ja mit strstr nicht weil da das Zeichen "\x00" enthalen ist, wie kann ich das sonst bewerkstelligen. Gibt es was fertiges oder muss ich mir das selbern basteln?



  • std::search müsste es tun. Du musst dir zunächst nen range anlegen, der die gewünschte Sequenz enthält, die kannst du dann als zu suchende Sequenz übergeben.



  • Optimizer schrieb:

    std::search müsste es tun. Du musst dir zunächst nen range anlegen, der die gewünschte Sequenz enthält, die kannst du dann als zu suchende Sequenz übergeben.

    Wir befinden uns im ANSI C-Forum 😃



  • Damn, sorry. 😞



  • ANSI Hansi schrieb:

    Ok ich suche eine Funktion für Speicherblöcke die wie strstr für Srings funktioniert. Ich möcht z.B. die Zeichenfolge "\x00\x01\x00" in einem Speicherblock finden. Das geht ja mit strstr nicht weil da das Zeichen "\x00" enthalen ist, wie kann ich das sonst bewerkstelligen. Gibt es was fertiges oder muss ich mir das selbern basteln?

    Nimm memcmp().

    MfG



  • freak11 schrieb:

    ANSI Hansi schrieb:

    Ok ich suche eine Funktion für Speicherblöcke die wie strstr für Srings funktioniert. Ich möcht z.B. die Zeichenfolge "\x00\x01\x00" in einem Speicherblock finden. Das geht ja mit strstr nicht weil da das Zeichen "\x00" enthalen ist, wie kann ich das sonst bewerkstelligen. Gibt es was fertiges oder muss ich mir das selbern basteln?

    Nimm memcmp().

    MfG

    Dat geht so nicht

    http://msdn.microsoft.com/en-us/library/zyaebf12(VS.80).aspx

    hab da mal was selbern gebastelt, es scheint zu funktionieren, Verbesserungsvorschläge werden dankend angenommen:

    u_char *memstr(u_char *feld, u_char *search, int len_feld, int len_search){
    
    	int			i;
    	u_char			*pos;
    	boolean			ok;
    
    	pos = feld;
    	while(pos < (feld + len_feld - len_search)){
    		if(*pos == *search){
    			ok = TRUE;
    			for(i = 1; i < len_search; i++){
    				if(*(pos+i) != *(search+i)){
    					ok = FALSE;
    					break;
    				}
    			}
    			if(ok == TRUE){
    				return pos;
    			}
    		}
    		pos++;
    	}
    	return 0;
    }
    


  • ANSI Hansi schrieb:

    freak11 schrieb:

    ANSI Hansi schrieb:

    Ok ich suche eine Funktion für Speicherblöcke die wie strstr für Srings funktioniert. Ich möcht z.B. die Zeichenfolge "\x00\x01\x00" in einem Speicherblock finden. Das geht ja mit strstr nicht weil da das Zeichen "\x00" enthalen ist, wie kann ich das sonst bewerkstelligen. Gibt es was fertiges oder muss ich mir das selbern basteln?

    Nimm memcmp().

    MfG

    Dat geht so nicht

    http://msdn.microsoft.com/en-us/library/zyaebf12(VS.80).aspx

    hab da mal was selbern gebastelt, es scheint zu funktionieren, Verbesserungsvorschläge werden dankend angenommen:

    u_char *memstr(u_char *feld, u_char *search, int len_feld, int len_search){
    	
    	int			i;
    	u_char			*pos;
    	boolean			ok;
    	
    	pos = feld;
    	while(pos < (feld + len_feld - len_search)){
    		if(*pos == *search){
    			ok = TRUE;
    			for(i = 1; i < len_search; i++){
    				if(*(pos+i) != *(search+i)){
    					ok = FALSE;
    					break;
    				}
    			}
    			if(ok == TRUE){
    				return pos;
    			}
    		}
    		pos++;
    	}
    	return 0;
    }
    
    unsigned char* cmpmem(unsigned char* feld, const unsigned char* search, int len_feld, int len_search)
    {
    	int i;
    	for(i = 0; memcmp(feld, search, sizeof search) || i == len_feld-len_search; feld++);
    	if (i == len_feld-len_search)
    		return 0;
    	else
    		return feld;
    

    MfG



  • unsigned char* cmpmem(unsigned char* feld, const unsigned char* search, int len_feld, int len_search)
    {
        int i;
        for(i = 0; memcmp(feld, search, sizeof search) || i == len_feld-len_search; feld++);
        if (i == len_feld-len_search)
            return 0;
        else
            return feld;
    

    wo wird hier i hochgezählt?? zweite bedingung tritt also nie ein;)

    unsigned char* cmpmem(unsigned char* feld, const unsigned char* search, int len_feld, int len_search)
    {
        int i;
        for(i = 0; memcmp(feld, search, len_search) || i == len_feld-len_search; feld++,i++);
           return (i == len_feld-len_search) ? 0 : feld;  
    }
    


  • HumanCompiler schrieb:

    unsigned char* cmpmem(unsigned char* feld, const unsigned char* search, int len_feld, int len_search)
    {
        int i;
        for(i = 0; memcmp(feld, search, len_search) || i == len_feld-len_search; feld++,i++);
           return (i == len_feld-len_search) ? 0 : feld;  
    }
    

    boah ich würd die Einrückung verändern, sieht so aus als würdest du im ersten for-schritt sofort returnen...

    unsigned char* cmpmem(unsigned char* feld, const unsigned char* search, int len_feld, int len_search)
    {
        int i;
        for(i = 0; memcmp(feld, search, len_search) || i == len_feld-len_search; feld++,i++)
            ;
        return (i == len_feld-len_search) ? 0 : feld;  
    }
    


  • boah... was soll das mit dem semikolon? ^^



  • BorisDieKlinge schrieb:

    boah... was soll das mit dem semikolon? ^^

    nichts tuen... einfach den nächsten Schleifendurchlauf machen.



  • BorisDieKlinge schrieb:

    boah... was soll das mit dem semikolon? ^^

    Boris du schaffst es immer wieder mein "Hero of the Day" zu werden und mir meinen (miesen) Tag zu versüßen 👍



  • lippoliv schrieb:

    HumanCompiler schrieb:

    unsigned char* cmpmem(unsigned char* feld, const unsigned char* search, int len_feld, int len_search)
    {
        int i;
        for(i = 0; memcmp(feld, search, len_search) || i == len_feld-len_search; feld++,i++);
           return (i == len_feld-len_search) ? 0 : feld;  
    }
    

    boah ich würd die Einrückung verändern, sieht so aus als würdest du im ersten for-schritt sofort returnen...

    unsigned char* cmpmem(unsigned char* feld, const unsigned char* search, int len_feld, int len_search)
    {
        int i;
        for(i = 0; memcmp(feld, search, len_search) || i == len_feld-len_search; feld++,i++)
            ;
        return (i == len_feld-len_search) ? 0 : feld;  
    }
    

    Dieser Code funktioniert ohnehin nicht...



  • lippoliv schrieb:

    boah... was soll das mit dem semikolon? ^^

    Groupie schrieb:

    Boris du schaffst es immer wieder mein "Hero of the Day" zu werden und mir meinen (miesen) Tag zu versüßen 👍

    ich lieb es leuten ein lächeln auf das gesicht zu zaubern...

    aber leider war das

    boah... was soll das mit dem semikolon? ^^

    ironie.. wenn du den thread ordentlich gelesen hast;) 👍



  • BorisDieKlinge schrieb:

    lippoliv schrieb:

    boah... was soll das mit dem semikolon? ^^

    Groupie schrieb:

    Boris du schaffst es immer wieder mein "Hero of the Day" zu werden und mir meinen (miesen) Tag zu versüßen 👍

    Wieso immer ich 😞 😃

    Den sath "boah... [...]" hast du geschrieben...



  • Danke für die Beiträge, wenigstens funktioniert mein Code.



  • unsigned char* cmpmem(unsigned char* feld, const unsigned char* search, int len_feld, int len_search)
    {
        int i;
        for(i = 0; memcmp(feld, search, len_search) || i == len_feld-len_search; feld++,i++)
            ;
        return (feld * ((int)(i == len_feld-len_search)));  
    }
    


  • mir ist langweilig schrieb:

    unsigned char* cmpmem(unsigned char* feld, const unsigned char* search, int len_feld, int len_search)
    {
        int i;
        for(i = 0; memcmp(feld, search, len_search) || i == len_feld-len_search; feld++,i++)
            ;
        return (feld * ((int)(i == len_feld-len_search)));  // <<
    }
    

    🤡
    VC2005 == error C2296: '*': Ungültig, da der linke Operand vom Typ 'unsigned char *' ist
    💡

    unsigned char* cmpmem(unsigned char* feld, const unsigned char* search, int len_feld, int len_search)
    {
        int i;
        for(i = 0; (memcmp(feld, search, len_search)) && (i != len_feld-len_search); feld++,i++)
            ;
    	return (i == len_feld-len_search)?0:feld;  
    }
    

    🕶


Anmelden zum Antworten