xk4fu Geschrieben 25. August 2008 Geschrieben 25. August 2008 hi, gibt es einen befehl, mit dem ich zeichen in einem char ersetzen kann? z.b. ein leerzeichen mit %20 Zitieren
Stage-6-BBB Geschrieben 25. August 2008 Geschrieben 25. August 2008 willst du in einem vorhandenen text die leerzeichen ersetzen oder was hast du genau vor? mfg Zitieren
TDM Geschrieben 25. August 2008 Geschrieben 25. August 2008 Char ist ein Zeichen. Char einfach neu zuweisen... Zitieren
Klotzkopp Geschrieben 25. August 2008 Geschrieben 25. August 2008 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 Zitieren
Guybrush Threepwood Geschrieben 25. August 2008 Geschrieben 25. August 2008 schau mal hier: CodeGuru: URI Encoding and Decoding Zitieren
xk4fu Geschrieben 26. August 2008 Autor Geschrieben 26. August 2008 (bearbeitet) 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 2008 von xk4fu Zitieren
xk4fu Geschrieben 26. August 2008 Autor Geschrieben 26. August 2008 schau mal hier: CodeGuru: URI Encoding and Decoding in c klappt das so nicht ^^ Zitieren
Guybrush Threepwood Geschrieben 26. August 2008 Geschrieben 26. August 2008 Klar klappt das so. Du kannst halt keinen std:string verwenden, aber das Prinzip ist das Selbe. Ist halt nicht einfach nur Copy&Paste Zitieren
xk4fu Geschrieben 26. August 2008 Autor Geschrieben 26. August 2008 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 Zitieren
Guybrush Threepwood Geschrieben 26. August 2008 Geschrieben 26. August 2008 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? Zitieren
xk4fu Geschrieben 26. August 2008 Autor Geschrieben 26. August 2008 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: Zitieren
Klotzkopp Geschrieben 26. August 2008 Geschrieben 26. August 2008 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. Zitieren
xk4fu Geschrieben 26. August 2008 Autor Geschrieben 26. August 2008 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) Zitieren
Klotzkopp Geschrieben 26. August 2008 Geschrieben 26. August 2008 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. Zitieren
xk4fu Geschrieben 26. August 2008 Autor Geschrieben 26. August 2008 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 Zitieren
Klotzkopp Geschrieben 26. August 2008 Geschrieben 26. August 2008 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. Zitieren
xk4fu Geschrieben 26. August 2008 Autor Geschrieben 26. August 2008 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... Zitieren
TDM Geschrieben 27. August 2008 Geschrieben 27. August 2008 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. Zitieren
xk4fu Geschrieben 27. August 2008 Autor Geschrieben 27. August 2008 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; Zitieren
xk4fu Geschrieben 27. August 2008 Autor Geschrieben 27. August 2008 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 Zitieren
TDM Geschrieben 27. August 2008 Geschrieben 27. August 2008 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. Zitieren
xk4fu Geschrieben 27. August 2008 Autor Geschrieben 27. August 2008 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? Zitieren
xk4fu Geschrieben 27. August 2008 Autor Geschrieben 27. August 2008 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 Zitieren
TDM Geschrieben 27. August 2008 Geschrieben 27. August 2008 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. Zitieren
xk4fu Geschrieben 27. August 2008 Autor Geschrieben 27. August 2008 ok, merci für die erklärung mit dem tisch schonmal^^ aber: strcpy geht bei mir nicht mehr, wenn ich nur char pointer verwende Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.