suche "strstr" für Speicher, also "memstr"
-
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; }