~~~~~~~
Prolog:
~~~~~~~
Was passiert, wenn man, z.B. in einer DOS-Box ist, sich z.B. im Verzeichnis c:\windows befindet und von dort aufruft:
> dir c:\
? Antwort: Der Inhalt des Root-Verzeichnisses von Laufwerk C: wird angezeigt.
Was passiert beim Aufruf von
> dir "c:\"
? Antwort: Dasselbe
~~~~~~~
Kapitel 1
~~~~~~~
Folgendes simples C-Programm 'ShowArgs' zeigt die über einen Kommandozeilenaufruf übergebenen Argumente an:
//---------------------------------------------------------------------------
#include
//---------------------------------------------------------------------------
void main(int argc, char *argv[])
{
for(int i=1; i< argc; i++)
printf("argv[%i]: %s\n", i, argv[i]);
}
//---------------------------------------------------------------------------
Rufe ich es jetzt analog zu oben auf:
Einmal mit
ShowArgs c:\
zeigt es an
argv[1]: c:\
Rufe ich es jetzt aber mit
ShowArgs "c:\"
auf, zeigt es folgendes an:
argv[1]: c:"
[Die Ursache, die mich in erster Linie weniger interessiert ist vermutlich, dass im zweiten Fall der Backslash '\' als Escape-Character gewertet wird und besagt, dass das folgende Zeichen ('"') nicht speziell interpretiert werden soll.]
???????-----------
? Meine Frage ist: Wie kann ich in C diese unerwünschte Uminterpretation vermeiden?
DIR.EXE ist doch vermutlich auch in C geschrieben?
???????-----------
(Würde DIR.EXE das Argument "c:\" als c:" interpretieren, so würde es beim Aufruf innerhalb von c:\Windows heraus den Inhalt von c:\Windows ausgeben. Einfach mal ausprobieren: dir c:" )
(Im Hinterkopf habe ich noch, dass es die Möglichkeit gibt, noch VOR main auf eine Funktion zuzugreifen (_main()), aber hatte bei einem Versuch keinen Erfolg. Vielleicht war das ja noch bei einem anderen System.)
Über das Problem gestolpert bin ich, als ein kleines Tool von mir, geschrieben zur Unterstützung von Batchdateien plötzlich unsinnig reagierte. Beim Debuggen war mir dann klar, warum...
Vielen Dank,
Mdl
Programmieren - alles kontrollieren 4.938 Themen, 20.667 Beiträge
Hi MDL, Dir war noch nie in C geschrieben, es existiert unter windows(wie auch unter DOS) keine dir.exe.
Viel mehr ist dir eine art alias auf cmd.exe, bzw command.com unter DOS / Win9x. Wenn du ein Commando unter einem der Windows Commandozeileninterpreter dir eingibst schaut selbiger erstmal in seinem eigenen befehlsreportoire nach, ob es sich um einen inbuilt befehl handelt. dir ist so einer. erst danach wird geschaut ob es eine dir.exe, dir.bat, dir.com oder dir.cmd gibt.
tatsächlich habe ich dein Programm mal ein wenig erweitert, um der ursache auf den grund zu gehen:
#include <stdio.h>
int main(int argc, char **argv)
{
int c;
for(c = 0; c {
printf("%d ",argv[1][c]);
}
return 0;
}
damit wird vom ersten Argument jeder einzelne char als ASCII Nummer auf der konsole ausgegeben:
C:\test>Project1.exe "C:\"
C:"
C:\test>Project1.exe \"C:\"
"C:"
C:\test>Project1.exe \"C:\"
34 67 58 34
C:\test>Project1.exe "C:\"
67 58 34
C:\test>
Dabei drängt sich mir jetzt folgender Verdacht auf:
unter windows escaped cmd.exe den aufruf, bevor das argument an das programm weitergegeben wird.
Daran kann man so auf die schnelle wohl nichts ändern. Aber ich überlege mir was, denn du hast es geschafft, dass mich das jetz beschäftigt