Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

hi,

gibt es einen befehl, mit dem ich zeichen in einem char ersetzen kann?

z.b. ein leerzeichen mit %20

willst du in einem vorhandenen text die leerzeichen ersetzen oder was hast du genau vor?

mfg

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

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

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

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:

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)

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.

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

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.

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

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.

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;

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

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.

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?

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

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.