PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Alternative zu find()



Darkmiller
30.06.2009, 16:29
Moin,

kennt wer eine Alternative zu find?

Mein Problem ist das ich ein char array habe:


char line[256];

und da ich einen String in der Funktion suchen und ersetzen will, dachte ich mir ich wandel das mal schnell in nen string um:


string platzhalter;
...
platzhalter = line;


und ersetze durch platzhalter.replace() einen Teilstring. Ich hatte es durch diese Weise auch hinbekommen, das Problem war schlicht und ergreifend, das das Programm abstürzte und eine Fehlermeldung ausspuckte... (war iwas mit Terminated blaaa, konnte ich mir nicht merken und gespeichert habs auch nicht weil ich weiterprobiert habe :P)

Nun gut, kennt wer noch möglichkeiten?

wacked
30.06.2009, 17:18
while (*line++){
if (line[i]='B') && (line[i+1]='C') )
break;
i++;
}damit hättest du das startelement des gesuchten Teilstrings(hier "BC") in i.ist aber ne bescheuerte methode.

inout
30.06.2009, 17:23
Mir fällt da auf Anhieb noch strchr() ein.

Darkmiller
30.06.2009, 17:48
danke, ich guck mir mal strchr() an, weil die Methode von dir wacked, bringt mir leider nichts bei teilstrings sondern nur bei einzelnen zeichen

blackberry
30.06.2009, 17:54
Ich hab mal meine alten Sourcecodes durchstöbert!


#include <cstdio>

void* malloc(unsigned int);
void* memcpy(void*, const void*, unsigned int);
int memcmp(const void*, const void*, unsigned int);
unsigned int strlen(const char*);

char* str2lower(char* buffer, int len)
{
for(int x=0;x<strlen(buffer);x++)
if (buffer[x] < 91 && buffer[x] > 64)
buffer[x] += 32;
return buffer;
}

char* str2upper(char* buffer)
{
for(int x=0;x<strlen(buffer);x++)
if (buffer[x] < 123 && buffer[x] > 96)
buffer[x] -= 32;
return buffer;
}

bool isValidSubstrKey(int a, unsigned int b, unsigned int len)
{
if (((a < 0) ? -a : a) > len)
return false;
if (a < 0)
return -a >= b;
return len >= a + b;
}

char* substr(FILE* fp, int a, unsigned int b)
{
int pos = ftell(fp);
fseek(fp, 0, SEEK_END);
int len = ftell(fp);
fseek(fp, pos, SEEK_SET);
if (b == 0)
b = (a < 0) ? -a : len - a;
char* buffer = (char*) malloc(b);
if (buffer == NULL || !isValidSubstrKey(a, b, len))
return NULL;
if (fseek(fp, a, SEEK_SET) != 0)
return NULL;
fread(buffer, 1, b, fp);
buffer[b] = 0;
fseek(fp, pos, SEEK_SET);
return buffer;
}

char* substr(const char* str, int a, unsigned int b, int len)
{
if (b == 0)
b = (a < 0) ? -a : strlen(str) - a;
char* buffer = (char*) malloc(b);
if (buffer == NULL || !isValidSubstrKey(a, b, strlen(str)))
return NULL;
memcpy(buffer, &str[(a < 0) ? strlen(str) + a : a], b);
buffer[b] = 0;
return buffer;
}

int strpos(const char* str, const char* find, int offset, int len)
{
int o = - strlen(find),
x = 0;
for(;offset<strlen(str);offset++)
if (x == strlen(find))
break;
else if (find[x] != str[offset])
x = 0;
else
x++;
return (offset == strlen(str)) ? -1 : offset + o;
}

int strpos(FILE* fp, const char* find, int offset)
{
int o = - strlen(find),
p = ftell(fp),
x = 0;
char str = 0;
fseek(fp, 0, SEEK_END);
int len = ftell(fp);
fseek(fp, offset, SEEK_SET);
for(;offset<len;offset++)
{
fread(&str, 1, sizeof(str), fp);
if (x == strlen(find))
break;
else if (find[x] != str)
x = 0;
else
x++;
}
fseek(fp, p, SEEK_SET);
return (offset == len) ? -1 : offset + o;
}

bool strcmp2(const char* a, const char* b, int len)
{
if (strlen(a) != strlen(b))
return false;
return memcmp(a, b, strlen(a)) == 0;
}

strpos interessiert dich vielleicht.
Wenn du eine Erklärung dazu willst dann frag einfach oder adde mich in ICQ.

PS: wie gesagt: der Code ist _alt_ - also nicht wundern wenn es nicht optimiert ist oder eher etwas deletant aussieht - da hab ich noch geübt :)


mfG. BlackBerry

Darkmiller
30.06.2009, 18:28
ich füg dich mal eben hinzu Blackberry, da ich strchr() doch nicht gebrauchen kann und für strpos() nur seiten finde die mit php zu tun haben...

wacked
30.06.2009, 18:32
strtok() gibbet doch auch noch.

blackberry
30.06.2009, 18:38
und für strpos() nur seiten finde die mit php zu tun haben...

Lustigerweise habe ich an PHP's strpos gedacht, als ich das geschrieben habe :)

Die Parameter folgen der selben Struktur.

http://de3.php.net/function.strpos

aKiller47
20.07.2009, 02:17
Wenn ihr hier wirklich mal ohne naive Textsuche arbeiten wollt , dann nehmt den KMP algo der is hamma