Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

Ex. in C/C++ auch alternative 'main'-Funktion, die ...

Mdl / 9 Antworten / Baumansicht Nickles

Ex. in C/C++ auch alternative 'main'-Funktion, die ...

... die Argumente, die dem Programm von der Konsole übergeben werden NICHT interpretiert?

Eine C/C++ Hauptfunktion sieht ja in der Regel in etwa so aus:

int main(int argc, char *argv[]);

Angenommen, ich rufe von der Konsole mein Programm MyPrg.exe wie folgt auf

myprg.exe  Hello      World

so landet die Programmausführung irgendwann bei obiger main()-Funktion und die Werte sind

  argc==3

  argv[0]==myprg.exe, argv[1]="Hello" und argv[2]="World"

Ich kann also mit main() nicht ermitteln, wieviele Leerzeichen zwischen Hello und World stehen. Das könnte irgendeine vorgeschaltete Instanz.

Gibt es vielleicht doch eine Möglichkeit? Wird die gesamte Aufrufsequenz vielleicht in einer main()-vorgeschalteten Funktion innerhalb C/C++ komplett als ein Argument "myprg.exe  Hello      World' übergeben? Ich meine, ich hätte so ewas vor langer Zeit mal gelesen.

Wenn diese Interpretation bereits von der Konsole komplett interpretiert würde, würde es gar keine Möglichkeit geben den ECHO-Befehl als C-Prg. zu realisieren.Vielleicht gibt es die auch gar nicht - ECHO ist ja ein interner Befehl (d.h. es gibt kein ECHO.EXE) . Vielleicht ja aber doch...

Viele Grüße,

Mdl

P.S. Ich benutze den Embarcadero's C++Builder

bei Antwort benachrichtigen
mi~we Mdl „Ex. in C/C++ auch alternative 'main'-Funktion, die ...“
Optionen
Gibt es vielleicht doch eine Möglichkeit?

Unter Windows: GetCommandLine()

http://stackoverflow.com/questions/14150374/how-to-get-the-raw-command-line-arguments

"Es wäre dumm, sich über die Welt zu ärgern. Sie kümmert sich nicht darum." (Marc Aurel)
bei Antwort benachrichtigen
Mdl mi~we „Unter Windows: GetCommandLine ...“
Optionen

Hi Mi~We,

habe Deine Antwort doch tatsächlich überlesen und bin erst jetzt  (fast 1 Monat später zufällig wieder draufgestoßen, durch das letzte Posting von Borlander).

Vielen Dank dafür.

Habe es gleich ausprobiert und es GetCommandLine() klappt prima. Es werden sogar die Leerzeichen am Ende - interessanterweise nicht die am Anfang - einer Zeile mitgeliefert.

;-) ;-) ;-) ;-) ;-) ;-)

Viele Grüße,

Mdl

bei Antwort benachrichtigen
mi~we Mdl „Hi Mi We, habe Deine Antwort doch tatsächlich überlesen ...“
Optionen

Besser spät als nie.Zwinkernd Hauptsache es funktioniert wie gewünscht.

"Es wäre dumm, sich über die Welt zu ärgern. Sie kümmert sich nicht darum." (Marc Aurel)
bei Antwort benachrichtigen
Borlander Mdl „Ex. in C/C++ auch alternative 'main'-Funktion, die ...“
Optionen
... die Argumente, die dem Programm von der Konsole übergeben werden NICHT interpretiert?

Das macht bereits der Kommendozeileninterpreter der das Programm dann mit den übergebenen (durch whitespaces getrennten) Parametern aufrufst.

Wenn Du Parameter mit Leerzeichen übergeben willst, dann musst Du diese in Anführungszeichen einschließen.

bei Antwort benachrichtigen
Mdl Borlander „Das macht bereits der Kommendozeileninterpreter der das ...“
Optionen
Das macht bereits der Kommendozeileninterpreter

Hatte ich fast befürchtet/vermutet.

Schön wäre natürlich eine Möglichkeit im Kommandozeileninterpreter dieses (ansich ja sinnvolle) Verhalten kurzzeitig zu deaktivieren (und nach dem Prg.aufruf) erneut wieder zu aktivieren?

So könnte z.B. in argv[1] dann die gesamte Parameter-Aufrufsequenz stehen... (*)

Dann könnte man z.B. selbst sein eigenes Echo schreiben...

Wenn Du Parameter mit Leerzeichen übergeben willst, dann musst Du diese in Anführungszeichen einschließen.

Ja, und im Normalfall ist das ja auch gar kein Problem. Wenn man aber - wie ich in letzter Zeit - viele sich gegenseitig aufrufende Batchfiles hat, ist das dann doch nicht so einfach.

Werde vermutlich in nächster Zeit dazu einen separaten Thread erstellen. 

Gruß,

Mdl

(*) Mir kommt gerade eine Idee, die ich aber in einem separaten Posting schreibe, sonst geht sie vielleicht unter...

bei Antwort benachrichtigen
Borlander Mdl „Hatte ich fast befürchtet/vermutet. Schön wäre ...“
Optionen
dieses (ansich ja sinnvolle) Verhalten kurzzeitig zu deaktivieren (und nach dem Prg.aufruf) erneut wieder zu aktivieren?

Ich vermute, dass das mit dem Standardinterpreter von Windows nicht möglich ist. Ggf. mit einer Alternative.

Wenn man aber - wie ich in letzter Zeit - viele sich gegenseitig aufrufende Batchfiles hat, ist das dann doch nicht so einfach.

Das sehe ich nun nicht so kritisch. Zumal es generell empfehlenswert ist Parameter mit variablem Inhalt in Anführungszeichen zu übergeben.

bei Antwort benachrichtigen
Mdl Nachtrag zu: „Ex. in C/C++ auch alternative 'main'-Funktion, die ...“
Optionen

ALTERNATIVE: Kann man in C/C++ vielleicht auf eine gloabale Variable zurückgreifen, die die Argumente uninterpretiert beinhaltet?

Vielleicht gibt es ja sogar die Möglichkeit Historie des Kommandozeileninterpreters zuzugreifen?

Gruß,

Mdl

bei Antwort benachrichtigen
Borlander Mdl „ALTERNATIVE: Kann man in C/C vielleicht auf eine gloabale ...“
Optionen

Hast Du es denn schon mal mit dem Ansatz von mi~we probiert?

bei Antwort benachrichtigen
Mdl Borlander „Hast Du es denn schon mal mit dem Ansatz von mi we probiert?“
Optionen

Danke für die Nachfrage. Hatte es tatsächlich übersehen...

bei Antwort benachrichtigen