Schleife
-
Wie könnte ich das mit dem realloc noch einbauen? Wenn ich die Größe verdopple, funzt es leider nicht...
-
int ersetzen(const char *such, const char *neu, char **inp, int *inp_len) { ... //Wenn die Anzahl der Zeichen, die in inp gespeichert werden sollen, mehr sind //als in inp passen if(... >= *inp_len) { //um 1024 Byte vergrößern (kann auch eine andere Größe sein) *inp_len += 1024; //größeren Speicherplatz reservieren *inp = realloc(*inp, *inp_len); //Prüfung ob Reservierung geklappt hat if(!*inp) { //Kein Speicher mehr verfügbar, also raus! //(davor evtl. noch Sachen machen, die beim Beenden wichtig sind, z. B. free()) exit(1); } } ... }
-
Bei realloc bekomme ich immer einen Fehler von wegen:
Konvertierung des Parameters 1 von 'char' in 'void *' nicht moeglich
... obwohl mein 1.Parameter *inp ist. Müsste doch eigentlich hinhauen oder??
-
Quatsch was ich da geschrieben hab.
Zeig mal deine komplette Funktion. Hast du bei den Parametern, speziell bei inp, auch zwei * also ** gemacht??
-
kann jemand zufällig hier noch ein realloc einbauen, so dass es evtl funzen könnte? Ich bekomme ja bei meinen Versuchen die allerschärfsten Fehler...
Ich ersetze immer 4 Zeichen des Strings durch 10 Zeichen. Aber sobal der neue grösser als der alte String ist, geht nichts mehr:int ersetzen(char *such, char *neu, char *inp) { int flag,num=0; //rv beinhaltet wieviele ersetzungen gemacht wurden int laenge_text = STR_MAX; char *p,*q,*r, *buffer; buffer =(char*)malloc(sizeof(char)*(strlen(inp)+1)); //buffer zum umkopieren allokieren for(p=inp;*p;++p) //für jedes zeichen des inputs { flag=1; for(q=such,r=p;*q&&*r&&flag;++q,++r) //checkt ob such ab der stelle wo p gerade steht im string ist { if(*q-*r)flag=0; //wenn ja ist flag nach dem schleifendurchlauf auf 1 sonst 0 } if(flag) //wenn zu ersetzender text gefunden { for(q=buffer;*r;++q,++r) //kopiere das was nicht überschrieben werden solll in den buffer { *q=*r; } *q='\0'; for(q=neu,r=p;*q;++q,++r) //schreibe das neue wort an die aktuelle stelle { *r=*q; } for(q=buffer;*q;++r,++q) //kopiere das im buffer gesicherte zurück hinter die ersetzte stelle { *r=*q; } *r='\0'; ++num; } } free(buffer); //buffer wieder freigeben return num; }
-
Zum Problem mit inp und des reservierten Speichers:
Man könnte inp auch als Zeiger auf einen Zeiger übergeben (**) und in der Funktion mir realloc() bei Bedarf vergrößern. Die aktuelle Größe von inp wäre dann natürlich auch nützlich .jo da hatte ich keine lust mehr drauf
anfangs wollte er ja nur einen ansatz...
das hier ist übrigens ne üble sache
*inp = realloc(*inp, *inp_len);
sollte man nicht tuen weil wenn realloc fehl schlägt hat man ein memoryleak.
besser ist es erst auf nen tmp-zeiger realloc zu verwenden und denn dann auf NULL zu checken bevor man dann *inp=tmp; zuweist... wenns nicht geklaptt hat zeigt dann inp immer noch auf den speicherbereich den man vorher hatte, an sonsten hängt der speicher verloren "rum"
-
Könntest du mal die realloc() in deinen Code mit einbauen? Ich weiß nicht was ich falsch mache, aber ich kriege diese Funktion nicht in "deinem Code" unter
Würde mich echt freuen wenn du diese ein bis zwei zeilen noch dazuschreiben könntest, du kennst dich doch mit deinem Code am besten aus. *SCHNIEF*
und ich möchte irgendwie dieses sch... Thema abschließen.Danke, Gruss Evil411_unlogged
-
@Windalf
Schau mal was ich danach mache :). Wenn das Programm noch weiterlaufen soll, hast du natürlich recht. Allerdings macht es da wenig Sinn, da es ja die Aufgabe nicht richtig vollenden kann.
-
Weiss wirklich niemand von euch, wie ich jetzt noch das realloc in den oben geposteten Quellcode bekomme.
Mir platzt gleich der Schädel und es klappt noch nicht.
Ich hoffe mir kann in der Hinsicht noch jemand weiter helfen.
-
@evil411
Ich habe auch noch andere Dinge zu tuen als den ganzen Tag im Forum zu gucken ob ich irgendwelche Fragen beantworten kann. zumindest nen Tag sollte man sich ggf. gedulden könnenso habs schnell zusammengehackt,
ist jetzt super scheisse geworden der quellcode, einfach nur noch ein zusammengehacke sollte aber funzen, habs jetzt nicht gross getestint ersetzen(char *such, char *neu, char **inp,int *inp_l){ int flag,a=0,x=strlen(neu),y=strlen(such),z=strlen(*inp),rv=0; char *p,*q,*r,*tmp; tmp=(char*)malloc(sizeof(char)*(z+1)); for(p=*inp;*p;++p,++a){ flag=1; for(q=such,r=p;*q&&*r&&flag;++q,++r)if(*q-*r)flag=0; if(flag){ z+=x-y; if(*inp_l<=z){ q=(char*)realloc(*inp,sizeof(char)*(z+1)); if(q){p=q+a;r=p+y;*inp=q;*inp_l=z+1;} else return -1; } for(q=tmp;*q++=*r++;); for(q=neu,r=p;*r++=*q++;); for(q=tmp,--r;*r++=*q++;); p+=x; a+=x; ++rv; } } free(tmp); return rv; } int main(){ int inp_l=60; char *inp; inp=(char*)malloc(sizeof(char)*inp_l); sprintf(inp,"trlalala 1234 asdfasdf gmx 1234 ende feierabend 1234"); printf("%s\n",inp); ersetzen("1234","abcdefghijklmnopre",&inp,&inp_l); printf("%s\n",inp); free(inp); }
-
ja, mit diesem String funktioniert es. Aber wenn ich meinen String (char inp[100000]) nehme gehts nicht? Schnief!
Woran könnte das evtl. noch liegen????
-
ja, mit diesem String funktioniert es. Aber wenn ich meinen String (char inp[100000]) nehme gehts nicht? Schnief!
Woran könnte das evtl. noch liegen????klar gehts dann nicht. das hab ich dir doch schon mal geschrieben gehabt.
wenn du diesen speicher konstanter grösser auf den stack packst, kannst du ihn nicht verändern. er ist nun mal konstant du kannst da nicht mehr an der grösse drehen. wenn du ein array variabler grösse brauchst, geht das in c nur mit malloc und realloc....da kannst du mit deinem char inp[100000] soviel rumprobieren wie du willst das wird nie funktionieren.
mal davon abgesehen solltest du auf den stack keine array packen die viel grösser als 1000 sind sonst ist der irgendwann mal dicht und dein programm kackt ab.