Escapesequenzen: Was passiert mit dem String



Escapesequenzen: Was passiert mit dem String

Mario P., 19.03.2008 19:24: Hallo an alle,
in diesem kleinem Prog passiert bei mir folgendes:
Versuch 2 ergibt als Ausgabe: String 2 : Icin\eine\Pfad-\Angabe\
Versuch 3 ergibt als Ausgabe: String 3 : Ich\willuch\eine\Pfad-Angabe\sein!!\

' XPSE-Quelltext erkannt.C-Style (XPSE) 

{$IQ}
Proc XPath
   Parameters x_PfadInput$
   Declare x_PfadOutput$
   Clear x_PfadOutput$
   While @Len(x_PfadInput$)
      x_PfadOutput$ = x_PfadOutput$ + @Left$(x_PfadInput$,1)
      Case @Left$(x_PfadInput$,1) = "\" : x_PfadOutput$ = x_PfadOutput$ + "\"
      x_PfadInput$ = @Del$(x_PfadInput$,1,1)
   EndWhile
   Return x_PfadOutput$
EndProc
Declare Text$
cls
Text$ = "C:\Programme\ProgrammXYZ\UVZ1\Programm.exe"
print "1. Versuch"
print "String 1 : ",Text$
print "============================================================="
print "String 1 zurück : ", XPath (Text$)
print "============================================================="
Print ""
print "2. Versuch"
Clear Text$
Text$ = "Ich\bin\eine\Pfad-\Angabe\"
print "String 2 : ",Text$
print "============================================================="
print "String 2 zurück : ", XPath (Text$)
print "============================================================="
Print ""
print "3. Versuch"
Clear Text$
Text$ = "Ich\will\auch\eine\Pfad-Angabe\sein!!\"
print "String 3 : ",Text$
print "============================================================="
print "String 3 zurück : ", XPath (Text$)
print "============================================================="
Print ""
print "4. Versuch"
Clear Text$
Text$ = ">>>Ich bin ein ganz normaler String<<<"
print "String 4 : ",Text$
print "============================================================="
print "String 4 zurück : ", XPath (Text$)
print "============================================================="
Print ""
Print "WAS PASSIERT IM 2. UND 3. VERSUCH MIT DEM STRING ???"
waitinput
end
Wo sind denn meine Buchstaben / Zeichen aus in der Var Text$ hin ??
Mario


David Strutz, 19.03.2008 19:30: Escapesequenzen beachtet?


Mario P., 19.03.2008 19:35: Ein String in " " sollte doch ein String bleiben, oder ???
Wenn das z.B. bei der Rückgabe von @ChooseDir$(S) passiert , das genau die Folge von Zeichen im Rückgabestring steht, was dann ??
Mario


Sebastian K., 19.03.2008 19:56: Hallo Mario,
In XProfan und vielen anderen Programmiersprachen ist es üblich, dass durch einen Backslash in Literalen (und nur dort, nicht in String-Variablen und Funktions-Rückgaben) spezielle Sonderzeichen dargestellt werden, z.B. "\n" für einen Zeilenumbruch. Eine genau Liste findest Du in der XProfan-Hilfe unter "Escape-Sequenzen".
Kurz: Wenn Du einen Backslash möchtest, immer "\\" schreiben...
MfG
Sebastian


Mario P., 19.03.2008 20:14: Was mache ich dann mit der Rückgabe von z.B. @ChooseDir$(S) (da ist's mir heute aufgefallen) ?? Das ist ein String mit nur "einfachen" Backslash's, welchen ich ja in einer
Variablen (XYZ$) speichern muss, um diese weiter zu verarbeiten.
Mario


Horst Horn, 19.03.2008 20:49: @Mario
  Zitat: „Was mache ich dann mit der Rückgabe von z.B. @ChooseDir$(S) (da ist's mir heute aufgefallen) ?? Das ist ein String mit nur "einfachen" Backslash's, welchen ich ja in einer
Variablen (XYZ$) speichern muss, um diese weiter zu verarbeiten.

Verdopple ihn mit text$=Translate$(text$,"\","\\")


RGH, 19.03.2008 21:00:   Zitat von ""Horst Horn"": „@Mario
  Zitat: „Was mache ich dann mit der Rückgabe von z.B. @ChooseDir$(S) (da ist's mir heute aufgefallen) ?? Das ist ein String mit nur "einfachen" Backslash's, welchen ich ja in einer
Variablen (XYZ$) speichern muss, um diese weiter zu verarbeiten.

Verdopple ihn mit text$=Translate$(text$,"\","\\")

FALSCH! (Oder zumindest überflüssig, da Deine Zeile genau Nichts bewirkt!)
Der doppelte Backslash ist nur in LITERALEN notwendig, um einen eifachen Backslash darszustellen, wie Sebastian ja schon eindeutig in Übereinstimmung mit der XProfan-Hilfe erklärt hat. Also nur wenn im Programmtext ein Backslash zwischen zwei Anführungszeichen (also in einem Stringliteral) vorkommt, ist er (der Backslash) durch zwei zu ersetzen, da er sonst als Escapezeichen interpretiert wird.
Bei Pfadangaben darfst Du übrigens, um die Backslash-Problematik zu umgehen, auch den normalen Slash ("/") verwenden. Das Betriebssystem kommt damit genau so klar.
Gruss
Roland


Mario P., 19.03.2008 21:56: Hm,
und wenn ich's so nach Horst mache:

Declare Pfad1$
CLS
Pfad1$ = Translate$(@ChooseDir$("Bitte Verzeichnis auswählen"),"\","\\")
Print Pfad1$
waitinput
end
dann habe nur einfache \ 's in Pfad1$ stehen. Und somit immer noch das gleiche Problem.
Mario


Mario P., 19.03.2008 22:08: AHA,
wenn ich den Pfad "per Hand" eingebe, wird er, wenn er nur einfache \'s hat, verdreht.
Jetzt habe ich mir eben mal den Pfad C:\Ich\bin\ein\Pfad angelegt, dies mit ChooseDir$ abgefragt und anzeigen lassen (wie obendrüber), dann wird's nicht verdreht.
Obwohl beideErgebnisse ja ein StringLiteral sind.
Naja, warum auch immer, wieder was gelernt....
Danke an alle
Mario


Mario P., 19.03.2008 22:20: Irgendwie scheint mein @Translate$ heute gar nix machen zu wollen....
Aber langsam dämmerts, auch wenns lang gedauert hat: Eine Ergebniss von z.b.
@chooseDir$(... ist ja das Erg. einer Funktion, darum stehts richtig da.
Wenn ich dieses Erg. jetzt mit Translate umwandeln will, z.B. um es in einer INI zu speichern und später wieder aufzurufen, geht das nicht. Aber das wird auch noch....


Horst Horn, 20.03.2008 07:17: @Roland
  Zitat: „FALSCH! (Oder zumindest überflüssig, da Deine Zeile genau Nichts bewirkt!)
So FALSCH! kann das gar nicht sein
Ich widerspreche Dir ungern, aber wenn ich früher (weiss nicht mehr, unter welcher Version) einen Pfad in einer INI-Datei normal abgespeichert hatte, bekam ich dann bei Benutzen des Pfades (COPY, LOAD oder Ä. Fehlermeldungen - "Kann Datei nicht laden" oder "Kann Datei nicht kopieren") - Damals hab ich mir angewöhnt, alle Pfade mit TRANSLATE$( ) mit doppelten Backslash in die INI-Datei zu schreiben. Das mag nicht elegant sein oder vielleicht auch nicht mehr nötig. Aber es funktioniert! Die doppelten Backslash tun keinem weh, im Zeitalter von riesigen RAM-Speichern und GB-Speichersticks spielen auch ein paar Zeile mehr Code keine Rolle und langsamer wird das Programm auch nicht. Das immer wieder Überraschungen auftauchen, an denen XProfan nicht schuld ist, hab ich gestern im PROFAN-Forum gelesen. Unter VISTA wird das Startbild nicht mit LoadBmp... geladen !? - Rolf (stolzer VISTA-Benutzer) bestätigt das und schreibt, nach einem "doppelten Loadbmp..." direkt hintereinander klappt es. Also auch eine Fehlfunktion, die nichts mit XProfan zu tun hat - Ich bin kein Genie und quäle mich manchesmal durch meinen Quelltext, da mir grundlegendes Wissen in meinen jungen Jahren nicht vermittelt wurde. "Chefprogrammierern" hier in der Community kann ich niemals das Wasser reichen, aber meine Programme laufen auf unterschiedlichen Systemen und bisher hab ich (auch mit Hilfe aller) möglichst alle Fehlermeldungen umschifft. Das text$=TRANSLATE$(text$,"\","\\") wird auch weiterhin in meinem Code stehen. So FALSCH! kann es nämlich nicht sein -
Sorry für den langen Text - aber schliesslich heisse ich ja auch Horn

[offtopic]PS: Das soll keine Drohung sein !
Ostern wird PASS-PORT 2.0 hier hochgeladen. Da in der Version die Daten je nach Wunsch auf einen beliebigen Speicherplatz kopiert werden können, ist hier natürlich auch "ChooseDir$" in Benutzung. Die Zielwege werden alle mit 'Translate....'
eingetragen und es funktioniert ![/offtopic]


Sebastian K., 20.03.2008 09:57: @Horst: Dein Translate-Aufruf bewirkt tatsächlich nichts, da er die Backslashes eben nicht verdoppelt! Der folgenden Code demonstriert dies:

cls
var s1$ = "C:\\test\\hallo"
var s2$ = TRANSLATE$(s1$,"\","\\")
print "Alt:", s1$
print "Neu:", s2$
waitkey
end
Erklärung: Beide Strings, sowohl "\" als auch "\\", stellen nur einen einfachen Backslash dar, das ganze ist also nur ein Aufruf der Art text$=TRANSLATE$(text$,"A","A")... Denn: "\\" ist völlig korrekt ein Backslash, "\" allerdings auch, weil XProfan bei unbekannten Escape-Sequenzen nicht meckert sondern nur den Backslash stehen lässt....
MfG
Sebastian


Dies ist die Offlinevariante vom Thread [Escapesequenzen: Was passiert mit dem String].

Valid CSS!

©2006 XProfan.Com