Veröffentlicht 25. August 200817 j hi, gibt es einen befehl, mit dem ich zeichen in einem char ersetzen kann? z.b. ein leerzeichen mit %20
25. August 200817 j willst du in einem vorhandenen text die leerzeichen ersetzen oder was hast du genau vor? mfg
25. August 200817 j Die Frage sollte wohl lauten: "Wie ersetze ich einzelne Zeichen in einem char-Array durch eine andere Zeichenkette?" Wenn man nicht mit einem zweiten Array arbeiten will, muss man alle Zeichen hinter der Ersetzungsstelle um so viele Zeichen nach hinten verschieben, wie der neue Text länger als der Alte ist, bevor man die Ersetzung vornehmen kann. Eine fertige Funktion gibt es dafür nicht. Die Antwort auf die urspünglich Frage lautet übrigens ganz klar: Nein
26. August 200817 j danke schonmal, werd ich mir anschaun; ich brauch das ganze für einen aufruf mit wget in der url muss ich also alle " " mit "%20" ersetzen, da eine url ja keine leerzeichen kennt btw hab ich ein char[500] damit hab ich nicht nur ein zeichen... Bearbeitet 26. August 200817 j von xk4fu
26. August 200817 j Klar klappt das so. Du kannst halt keinen std:string verwenden, aber das Prinzip ist das Selbe. Ist halt nicht einfach nur Copy&Paste
26. August 200817 j habs jetzt nach ein paar stunden selber gelöst muss dazu sagen, dass ich noch NIE mit c oder c++ programmiert habe, deswegen die schwierigkeiten hab nur noch n kleines problem mit asprintf, weil ich den speicher nie freigebe o_O aber da das eh nur ein kurzer aufruf jeweils ist (ich hab n neues protokoll für yaps erstellt, das über wget mit hilfe eines anderen dienstanbieters sms verschickt), sollte das nicht viel ausmachen
26. August 200817 j Bis das Programm dann aufeinmal doch noch für was anderes genutzt werden soll und sich plötzlich gewundert wird wo die Speicherlecks herkommen Du weißt doch wo das Problem ist und wie du es lösen kannst, was spricht also dagegen die Speicherlecks zu verhindern?
26. August 200817 j habs jetzt jeweils so gemacht //Gibt den Speicher von stringSaved wieder frei***** strcpy(stringSavedFree, stringSaved); //** free(stringSaved); //** stringSaved = stringSavedFree; //** //************************************************** hoffe das ist so richtig :confused:
26. August 200817 j hoffe das ist so richtig :confused: Das kann man nicht genau sagen, ohne zu wissen, was stringSaved und stringSavedFree genau sind, und was du vorher mit ihnen machst. Es sieht aber ziemlich verdächtig aus.
26. August 200817 j siehts verdächtig richtig aus, oder verdächtig falsch stringSavedFree ist nur eine temp variable, in der ich stringSaved zwischenspeicher... und stringSaved weise ich nur einen wert mit hilfe von asprintf zu; asprintf reserviert aber jedesmal einen neuen speicherplatz, daher gebe ich stringSaved mit free wieder frei (davor natürlich in stringSavedFree zwischenspeichern)
26. August 200817 j siehts verdächtig richtig aus, oder verdächtig falsch Verdächtig falsch. Allerdings lässt sich dazu mit deinen etwas dürftigen Erklärungen nicht mehr sagen. Es ist wichtig, welchen Typ die Variablen genau haben, und was du genau damit machst. Du müsstest schon den Code zeigen.
26. August 200817 j Verdächtig falsch. Allerdings lässt sich dazu mit deinen etwas dürftigen Erklärungen nicht mehr sagen. Es ist wichtig, welchen Typ die Variablen genau haben, und was du genau damit machst. Du müsstest schon den Code zeigen. hab doch jetzt genau erklärt, was ich mit den zwei variablen mache... sind jeweils char variablen asprintf(&stringSaved, "%s", "Test") //nicht mehr und nicht weniger... strcpy(stringSavedFree, stringSaved); //zwischenspeichern free(stringSaved); //speicher freigeben stringSaved = stringSavedFree; //rückkopieren
26. August 200817 j hab doch jetzt genau erklärt, was ich mit den zwei variablen mache...Nein, hast du nicht. sind jeweils char variablenDas kann ja schon mal nicht sein. stringSaved ist mit ziemlicher Sicherheit ein char-Zeiger und stringSavedFree könnte auch ein char-Array sein. Das klingt für dich jetzt vielleicht nicht so, aber das sind wichtige Unterschiede. Der Umgang mit Strings ist in C nicht gerade trivial. Von solchen Details hängt ab, ob dein Code richtig oder falsch ist. Du hast immer noch nicht genug Code gezeigt. Die Definitionen und Initialisierungen fehlen. Es ist nicht zu erkennen, ob stringSavedFree überhaupt auf ein hinreichend großes Array zeigt, dass du strcpy aufrufen könntest.
26. August 200817 j bin jetzt nicht mehr in der arbeit kann ich also morgen erst genau sagen die varibalendeklaration sieht so aus: char *stringSaved; char stringSavedFree[500] = ""; der code funktioniert einwandfrei! um was es mir geht ist, ob durch meinen code mit free auch wieder der speicher freigeben wird...
27. August 200817 j um was es mir geht ist, ob durch meinen code mit free auch wieder der speicher freigeben wird... Nein, mit Free wird nur alloctierter speicher freigegeben. (siehe malloc) Da du das aber anscheinend nicht verwendest [...]. Im übrigen ist der speicher dann immernoch belegt, könnte aber beim nächsten alloctieren überschrieben werden, was zu undefiniertem Verhalten führt.
27. August 200817 j also bringt mir das alles quasi nix? ich will ja mit den drei zeilen nur den speicher freigeben, den asprintf jedesmal belegt... strcpy(stringSavedFree, stringSaved); free(stringSaved); stringSaved = stringSavedFree;
27. August 200817 j also bringt mir das alles quasi nix? ich will ja mit den drei zeilen nur den speicher freigeben, den asprintf jedesmal belegt... strcpy(stringSavedFree, stringSaved); free(stringSaved); stringSaved = stringSavedFree; und nur zur info: auch asprintf bindet den speicherplatz variabel
27. August 200817 j Ich hab erstmal nachgeschaut was asprintf macht. Da die Funktion automatisch alloctiert, sollte man doch free'n. Aber - ich halte es für unsinnig mehrere zeiger zu verwenden: char * pC; asprintf(&pC, "%s", "Test"); //tue irgendwas mit text free(pC) Das reicht vollkommen. Deine Zeile: stringSaved = stringSavedFree; //rückkopieren ist nähmlich gefährlich.
27. August 200817 j ja, wenn in stringSaved weiterhin der wert steht, trotz free(stringSaved), dann reicht eine variable; ich will ja mit stringSaved weiterarbeiten... aber ich denke, dass doch die variable wieder leer ist, wenn ein free(stringSaved) gemacht wurde, oder?
27. August 200817 j und ich glaub eher, dass diese zeile gefährlich ist: strcpy(stringSavedFree, stringSaved); da stringSavedFree auf 500 zeichen beschränkt ist, stringSaved aber nicht... eine andere möglichkeit fällt mir aber atm nicht ein
27. August 200817 j ja, wenn in stringSaved weiterhin der wert steht, trotz free(stringSaved), dann reicht eine variable; ich will ja mit stringSaved weiterarbeiten... Dann mach das doch. aber ich denke, dass doch die variable wieder leer ist, wenn ein free(stringSaved) gemacht wurde, oder? Nein. Der wird nur dereserviert. Wie wenn du in eine Gaststätte gehst, bestellst nen tisch, dann stellen die ein reserviert schild an den Tisch, wenn du da bist, kommt das schild weg, aber du sitzt ja trotzdem noch da. Es kann halt eben nur passieren, dass der Speicher bei einem nächsten Alloctieren wieder überschrieben wird, deswegen sollte man das am Schluss machen, wenn alles durch ist und dann den Zeiger auf NULL schreiben. (Dann ist er frei und leer.) und ich glaub eher, dass diese zeile gefährlich ist: strcpy(stringSavedFree, stringSaved); da stringSavedFree auf 500 zeichen beschränkt ist, stringSaved aber nicht... eine andere möglichkeit fällt mir aber atm nicht ein Ja, die auch. Da der Array aber leer ist, besteht er am Anfang nur aus einem zeichen (\0) und strcpy kopiert nur bis zum Zeichenkettenendekennzeichen. (Wie ich dieses Wort liebe ) Aber im Endeffekt richtig, wenn da ein längerer Text drin steht, als der, der vorher mit asprintf benutzt wurde, gibts nen Bufferoverflow. Deswegen würde ich nur einen charpointer und keine Arrays bei dem beispiel verwenden.
27. August 200817 j ok, merci für die erklärung mit dem tisch schonmal^^ aber: strcpy geht bei mir nicht mehr, wenn ich nur char pointer verwende
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.