\ in einer Variable durch \\ ersetzen
-
Hallo allerseits,
ich habe ein Programm geschrieben, wo man in eine Eingabebox einen Pfad zu einer Datei angibt und diese dann gelöscht wird.
Aber bislang muss der User noch bei der Pfadangabe Doppelbackslash zwischen den Ordner eintragen.
Wie kann ich C++ dazu bringen, das vom User eingegebene einfache Slash durch ein Doppelbackslash zu ersetzen?
-
Pfade zu Dateien haben nur einfache \.
Wenn du von Stings redest, dann hat "C:\\Programme\\Programm" keine Doppelslashes, obwohl es so aussieht. "C:\\\Programme\\\Programm" hat 2 Slashe und da wird dir Windows wahrscheinlich sagen, dass er den Pfad nicht findet.
"C:\Programme\Programm" wird dir eine Warnung geben, dass das Zeichen '\P' unbekannt ist und dein String wird tatsächlich so aussehen: "C:rogrammerogramm", weil er '\P' ignoriert.
Wenn du mit "Eingabebox" ein Edit-Control meinst, dann müssen einfache Slashes eingegeben werden und RemoveDirectory so übergeben werden.Ansonsten gibt es std::string::replace()
-
Ja, bis jetzt muss man bei der Eingabebox für den Pfad noch Doppelbackslashes machen, damit das funktioniert.
Und dev-Cpp kommt mit std::string::replace() nicht zurecht.
-
Unregistrierter schrieb:
Ja, bis jetzt muss man bei der Eingabebox für den Pfad noch Doppelbackslashes machen, damit das funktioniert.
Und dev-Cpp kommt mit std::string::replace() nicht zurecht.Dann frage ich mich aber, warum das so ist, dass man zwei Backshlashes eingeben muss. Das sollte nämlich nicht so sein.
-
Ein \ leitet ja in C++ eigendlich eine Funktion ein (\n,...) und bei der Backslashfunktion "\\" wird ein einzelnes Bachslash selbst geschrieben.
Ich suche also eine Funktion, mit der ich in einer Benutzereingabe das einzelnen Backslah durch doppelte ersetzten kann.
-
Unregistrierter schrieb:
Ein \ leitet ja in C++ eigendlich eine Funktion ein (\n,...) und bei der Backslashfunktion "\\" wird ein einzelnes Bachslash selbst geschrieben.
Das gilt nur für Stringliterale. "\" enthält nur einen einzigen Backslash. Nicht "es wird nur einer geschrieben" sondern "enthält nur einen". "\n" in einem Stringliteral macht ein Newline wie du richtig bemerkt hast, da ist aber weder ein Backslash noch ein n drin.
Ein Edit-Control ist aber kein Stringliteral. Wenn du da "\n" eingibst, dann steht da ein Backslash und ein n und kein Newline. Demzufolge unsere Verwunderung, wieso es mit "\" in der Benutzereingabe geht.
Zeige vielleicht etwas Code.
Machst du sowas in der Art?HWND benutzereingabe = CreateWindow(TEXT("EDIT"), ...); TCHAR buffer[1234]; GetWindowText(benutzereingabe, buffer, sizeof buffer / sizeof *buffer); RemoveDirectory(buffer);
-
...
-
Unregistrierter schrieb:
Aber bislang muss der User noch bei der Pfadangabe Doppelbackslash zwischen den Ordner eintragen.
Nö.
Aus welchem Buch haste gelernt?
-
Das würde ich auch gern mal wissen, warum der Benutzer unbedingt zwei Backslashes eingeben muss.
-
Ja, ich arbeite mit std::remove(); und das versteht in der Eingabe auch nur Doppelslashes, damit die am Ziel angageben Datei auch richtig gelöscht werden kann.
-
Zeig doch mal ein Beispiel, dass das von dir beschriebene Phänomen, dass hier keiner glauben will, aufweist. Mit etwas Code lässt sich sicher besser Fehlersuche betreiben.
-
Unregistrierter schrieb:
Ja, ich arbeite mit std::remove(); und das versteht in der Eingabe auch nur Doppelslashes, damit die am Ziel angageben Datei auch richtig gelöscht werden kann.
Falsch.
-
Unregistrierter schrieb:
Ja, ich arbeite mit std::remove(); und das versteht in der Eingabe auch nur Doppelslashes, damit die am Ziel angageben Datei auch richtig gelöscht werden kann.
Du verwechselst hier zwei grundlegende Dinge, wie nwp3 ja schon erklärt hat.
Zur Programmierzeit musst du in einem String für ein einfaches Blackslash ein "\" eingeben. Ein \ leiten eine Escape-Sequenz ein. Das bedeutet folgendes:
Wir haben folgenden String:
char *test = "Hallo\n\\test";Der String wird dann im Speicher so aussehen:
"Hallo",0x13,'\',"test",0x00Also gelten die Escape Zeichen auch nur zur Programmierzeit, und auch nur in C/C++. In Delphi oder VB wird das nicht unterstützt (zumindest mir nicht bekannt).
Also: Das Escape-Einleitungszeichen '\' wartet auf ein weiteres Zeichen, welches dann dazu führt, dass das entsprechende Zeichen zur Laufzeit an der betreffenden Stelle dargestellt wird.
Hier ist eine Liste von diesen entsprechenden Escape-Sequenzen:
http://msdn.microsoft.com/en-us/library/h21280bw(v=vs.80).aspx
-
escapesequence schrieb:
Zur Programmierzeit musst du in einem String für ein einfaches Blackslash ein "\" eingeben.
Er meint einen doppelten Backslash. Das Forum interpretiert \\ leider auch.
-
Ja, ich habe gedacht, dass man auch bei Benutzereingaben \\ schreiben muss, damit das funktioniert. Aber jetzt funktioniert das mit dem einzelnen Backshlash auch (Ich habs gerade ausprobiert)
-
Unregistrierter schrieb:
Ja, ich habe gedacht, dass man auch bei Benutzereingaben \\ schreiben muss, damit das funktioniert. Aber jetzt funktioniert das mit dem einzelnen Backshlash auch (Ich habs gerade ausprobiert)
Das ist ein Widerspruch. Wenn es mit einem Backslash geht, muss man keineswegs 2 schreiben.
-
_matze schrieb:
escapesequence schrieb:
Zur Programmierzeit musst du in einem String für ein einfaches Blackslash ein "\" eingeben.
Er meint einen doppelten Backslash. Das Forum interpretiert \\ leider auch.
Ja, böse Forensoftware!!
-
Hallo,
ja, jetzt ist das Problem endgültig gelöst; der User muss gar nicht Doppelbackslashes machen! Die Funktion std::remove() kann auch mit Einzellbackslashes die Datei löschen!
Gibt es in diesem Forum eine Art "Erledigt"-Button?
-
Unregistrierter schrieb:
der User muss gar nicht Doppelbackslashes machen!
Ach!
Unregistrierter schrieb:
Gibt es in diesem Forum eine Art "Erledigt"-Button?
Nein. Du kannst deinen ersten Beitrag editieren und ein "[erledigt]" vor den Titel schreiben. Aber bitte lösche weder den ursprünglichen Titel noch deine Postings. Manche Leute machen das gerne, warum auch immer. Damit wäre dann der Inhalt des Threads nicht mehr für die Nachwelt nachvollziehbar.
-
...