Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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 :D

Geschrieben (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 von xk4fu
Geschrieben

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

Geschrieben

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:

Geschrieben

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)

Geschrieben
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.

Geschrieben
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

Geschrieben
hab doch jetzt genau erklärt, was ich mit den zwei variablen mache...
Nein, hast du nicht.

sind jeweils char variablen
Das 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.

Geschrieben

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...

Geschrieben
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.

Geschrieben

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;

Geschrieben
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

Geschrieben

Ich hab erstmal nachgeschaut was asprintf macht. :rolleyes:

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.

Geschrieben

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?

Geschrieben

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

Geschrieben
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 :D)

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...