Startparameterzeichen werden interpretiert!?
-
Bashar schrieb:
BrauchHilfe schrieb:
das Problem ist folgendes wenn ich z.B. als parameter
@~>ANDWENDUNGSNAME.exe c:\users\benutzer\* 2Windows also? Das @~ am Anfang sieht komisch aus, ist das zufällig Cygwin?
dann startet das programm und erkennt nicht 2 startparameter sondern nur 1...
da es durch die eingabe von " oder * am ende des Pfades den 2.parameter nicht mehr vom 1. unterscheiden kann und deswegen nur noch 1 erkennt denk ich mal...Wieso gibst du die Parameter nicht einfach mal testweise aus anstatt herumzuspekulieren?
Wenn meine Vermutung oben richtig ist, dann gibt dir die Shell wie unter Unix üblich die bereits expandierten Parameter, d.h. konkret irgendwas mit * wird zu einer Liste von Dateinamen, die auf das Muster passen. Möglicherweise also auch zu einer leeren Liste.
jop windows sry hatte ich nicht mit gesagt (@- war jetzt nur fürs Beispiel) ist ein normaler "cmd" befehl... der die exe mit entsprechenden startparametern aufruft...
ich habe es schon ausgegeben jedoch weiß ich nicht was der * macht...
sieht dann so aus "C:\Users\benutzer" ... der rest fehlt...
also die 2 und der * sind weg... jedoch wohin? wie finde ich das heraus?
und was ja eigentlich meine Frage war... wie VERHINDERE ich das?
ps. ich nehme auch an das das wie bei unix einfach interpretiert wird... also die zeichen werden als operator und nicht als zeichen gesehen... jedoch wie kann ich verhindern das die Zeichen als operatoren interpretiert werden?
-
#include <iostream> int main(int argc, char* argv[]){ int i; for(i = 0; i < argc; i++){ std::cout << "Arg " << i << ": " << argv[i] << std::endl; } }compiliert mit "g++ test.cpp" und ausgeführt mit "a.exe c:\users\benutzer\* 2"
Ausgabe:Arg 0: a.exe Arg 1: c:\users\benutzer\* Arg 2: 2Kann das Problem also nicht nachvollziehen.
-
mhh das ist ja komisch...
ich hab einen mingw compiler...
keine ahnung wenn ich dein beispiel bei mir compiliere geht es nicht...
er zeigt mir nur den pfad ohne () also interpretiert ()...was kann ich da jetzt noch machen um den fehler zufinden? bzw. die interpretation von (*) oder z.B. (") abzufangen?
liegt das am compiler?
oder ist bei mir da i.was falsch eingestellt?
-
Setze mal testweise die Parameter in Anführungsstriche:
ANDWENDUNGSNAME.exe "c:\users\benutzer\*" 2
-
ne hilft nicht...

passiert genau das selbe... also der stern wird interpretiert... und nicht als zeichen erkannt...
-
Das Verhalten kann durch die globale Variable
_CRT_globgesteuert werden, also füge die folgende Zeile deinem Projekt hinzu:int _CRT_glob = 0;Oder du verwendest einfach MinGW-w64, denn dort ist das standardmäßig deaktiviert (und zudem ist es generell besser):
/* _dowildcard is an int that controls the globbing of the command line.
* The MinGW32 (mingw.org) runtime calls it _CRT_glob, so we are adding
* a compatibility definition here: you can use either of _CRT_glob or
* _dowildcard .
* If _dowildcard is non-zero, the command line will be globbed: .
* will be expanded to be all files in the startup directory.
* In the mingw-w64 library a _dowildcard variable is defined as being
* 0, therefore command line globbing is DISABLED by default. To turn it
* on and to leave wildcard command line processing MS's globbing code,
* include a line in one of your source modules defining _dowildcard and
* setting it to -1, like so:
* int _dowildcard = -1;
*/
-
EinGast schrieb:
Das Verhalten kann durch die globale Variable
_CRT_globgesteuert werden, also füge die folgende Zeile deinem Projekt hinzu:int _CRT_glob = 0;Oder du verwendest einfach MinGW-w64, denn dort ist das standardmäßig deaktiviert (und zudem ist es generell besser):
/* _dowildcard is an int that controls the globbing of the command line.
* The MinGW32 (mingw.org) runtime calls it _CRT_glob, so we are adding
* a compatibility definition here: you can use either of _CRT_glob or
* _dowildcard .
* If _dowildcard is non-zero, the command line will be globbed: .
* will be expanded to be all files in the startup directory.
* In the mingw-w64 library a _dowildcard variable is defined as being
* 0, therefore command line globbing is DISABLED by default. To turn it
* on and to leave wildcard command line processing MS's globbing code,
* include a line in one of your source modules defining _dowildcard and
* setting it to -1, like so:
* int _dowildcard = -1;
*/oh, sehr interessant.
da schau ich gleich mal, vielen dank für den tipp.
-
Bei der Behandlung von '*' und anderen Sonderzeichen gibt es Unterschiede zwischen cmd, also die normale Shell von Windows und anderen wie bash, ksh oder ähnlichen. Unter cmd werden die Zeichen nicht interpretiert. Das macht in der Regel das Programm, welches aufgerufen wird. Unter einer Unix-shell werden sie verarbeitet und das expandierte Ergebnis dem Prozess übergeben.
Führe ich unter cmd beispielsweise ein
echo *.xmlaus, ergibt das genau das: *.xml. Mache ich das gleiche unter bash, welches die Shell unter cygwin ist, bekomme ich die Liste der Dateien mit der Endung.xmlim aktuellen Verzeichnis.Die Interpretation ist also unabhängig davon, in welcher Sprache das Programm geschrieben ist.
Unter C++ finde ich das Ergebnis in argc/argv. Also
myprog *.xmlwird von der cmd aufgerufen inargv[1]den String "*.xml" sehen. Von der bash aufgerufen sieht es die Liste der Dateien.Will ich das unter bash unterdrücken, muss ich das der shell sagen und nicht dem Programm. Also beispielsweise
echo '*.xml'.Ich sollte noch erwähnen, dass die bash doch den String "*.xml" übergibt, wenn es keine Dateien findet.
Dass mingw da so einen Sonderweg geht ist interessant. Das wusste ich nicht.
-
BrauchHilfe schrieb:
EinGast schrieb:
Das Verhalten kann durch die globale Variable
_CRT_globgesteuert werden, also füge die folgende Zeile deinem Projekt hinzu:int _CRT_glob = 0;Oder du verwendest einfach MinGW-w64, denn dort ist das standardmäßig deaktiviert (und zudem ist es generell besser):
/* _dowildcard is an int that controls the globbing of the command line.
* The MinGW32 (mingw.org) runtime calls it _CRT_glob, so we are adding
* a compatibility definition here: you can use either of _CRT_glob or
* _dowildcard .
* If _dowildcard is non-zero, the command line will be globbed: .
* will be expanded to be all files in the startup directory.
* In the mingw-w64 library a _dowildcard variable is defined as being
* 0, therefore command line globbing is DISABLED by default. To turn it
* on and to leave wildcard command line processing MS's globbing code,
* include a line in one of your source modules defining _dowildcard and
* setting it to -1, like so:
* int _dowildcard = -1;
*/oh, sehr interessant.
da schau ich gleich mal, vielen dank für den tipp.
das funktioniert i.wie bei mir nicht...

tntnet schrieb:
Bei der Behandlung von '*' und anderen Sonderzeichen gibt es Unterschiede zwischen cmd, also die normale Shell von Windows und anderen wie bash, ksh oder ähnlichen. Unter cmd werden die Zeichen nicht interpretiert. Das macht in der Regel das Programm, welches aufgerufen wird. Unter einer Unix-shell werden sie verarbeitet und das expandierte Ergebnis dem Prozess übergeben.
Führe ich unter cmd beispielsweise ein
echo *.xmlaus, ergibt das genau das: *.xml. Mache ich das gleiche unter bash, welches die Shell unter cygwin ist, bekomme ich die Liste der Dateien mit der Endung.xmlim aktuellen Verzeichnis.Die Interpretation ist also unabhängig davon, in welcher Sprache das Programm geschrieben ist.
Unter C++ finde ich das Ergebnis in argc/argv. Also
myprog *.xmlwird von der cmd aufgerufen inargv[1]den String "*.xml" sehen. Von der bash aufgerufen sieht es die Liste der Dateien.Will ich das unter bash unterdrücken, muss ich das der shell sagen und nicht dem Programm. Also beispielsweise
echo '*.xml'.Ich sollte noch erwähnen, dass die bash doch den String "*.xml" übergibt, wenn es keine Dateien findet.
Dass mingw da so einen Sonderweg geht ist interessant. Das wusste ich nicht.
perfekt vielen dank
... hab das problem eben gelöst
!
mein problem war das ich es die ganze zeit über startparameter der ide gestartet hatte... also so das ich die dort "festsetzte" fürs debugging um nicht immer die Parameter ein zu tippern ... aber anscheindend nutzt meine ide nicht cmd....wenn ich es über cmd starte und mit parametern wird der * auch nicht interpretiert wie vollständig richtig von tntnet beschrieben... vielen dank für den hinweis und die hilfe !

bin ich froh das ich das problem bzw. die ursache gefunden habe...

VIELEN DANK!
-
edit: problem gelöst kann geschlossen werden...!
vielen dank an alle antworten

lg