Frage

    

Diese Frage bereits eine Antwort hier:

    
            
  •              Wann kann argv [0] haben null?                                      4 Antworten                          
  •     
    

In den Datenstrukturen Klasse, die ich zur Zeit nehmen, haben wir mit Schreiben eines Web-Crawler in C ++ beauftragt. Um uns einen Vorsprung, sofern uns der Professor mit einem Programm, um die Quelle von einer bestimmten URL zu bekommen und einen einfachen HTML-Parser, um die Tags Streifen aus. Die Hauptfunktion für dieses Programm akzeptiert Argumente und so Anwendungen argc / argv. Der verwendete Code für die Argumente zu überprüfen, ist wie folgt:

// Process the arguments
if (!strcmp(option, "-h"))
{
    // do stuff...
}
else if (!strcmp(option, ""))
{
    // do stuff...
}
else if (!strcmp(option, "-t"))
{
    // do stuff...
}
else if (!strcmp(option, "-a"))
{
    // do stuff...
}

if ( *argv == NULL )
{
    exit(1);
}

Wo "Option" hat mit dem Schalter in argv besiedelt [1], und argv [2] und höher hat die restlichen Argumente. Der erste Block I ganz gut verstehen, wenn der Schalter die Zeichenfolge gleich tut auf dem Switch, was basierend. Ich frage mich, was der Zweck der letzten, wenn Block allerdings ist.

Es könnte sein, dass mein C ++ etwas rostig, aber ich scheine * argv zu erinnern, äquivalent zu argv [0], im Grunde bedeutet, dass es sicher Argumente existieren zu machen, ist zu prüfen. Außer, dass ich hatte den Eindruck, dass argv [0] immer (zumindest in den meisten Implementierungen), um den Namen des Programms, das ausgeführt wird enthalten. Es kommt zu mir, dass argv [0] könnte null sein, wenn argc gleich 0 ist, aber auf Google mich um die Suche konnte keinen einzigen Beitrag zu bestimmen, ob oder nicht, das ist sogar möglich, finden.

Und damit ich an Sie wenden. Was genau ist die letzte, wenn Block Prüfung?

EDIT: Ich habe mit der Begründung in den Kommentaren der ausgewählten Antwort bereitgestellt gegangen, dass es möglich sein kann, absichtlich Ursache argv auf [0] NULL zu werden oder auf andere Weise wurde NULL basierend auf eine plattformspezifische Implementierung von Haupt.

War es hilfreich?

Lösung

argc werden Sie mit der Anzahl von Argumenten Befehlszeile übergeben bieten. Sie sollten nicht überprüfen, müssen auch die Inhalte von argv zu sehen, ob es nicht genug Argumente.

if (argc <= 1) { // The first arg will be the executable name
   // print usage
}

Andere Tipps

3.6.1 / 2:

  

Wenn argc nicht Null diese Argumente   wird in argv zur Verfügung gestellt werden [0] obwohl   ... und argv [0] wird der Zeiger sein   auf den Anfangszeichen eines NTMBS   dass für den Namen verwendet   rufen Sie das Programm oder „“. Der Wert von   argc soll nicht negativ sein. Der Wert   von argv[argc] soll 0 sein.

Der Schwerpunkt meiner. argc ist nur nicht-negative garantiert, nicht ungleich Null ist.

Dies ist beim Zugriff auf das Haupt. Es ist auch möglich, dass //do stuff ändert sich der Wert von argv, oder der Inhalt des Arrays es verweist. Es ist nicht ganz ungewöhnlich für Option Behandlungscode zu Verschiebungswerten aus argv, wie es sie verarbeitet. Der Test für *argv == null kann daher testen, ob es irgendwelche Befehlszeilenargumente links, nachdem die Optionen oder übersprungen wurden entfernt. Sie würden auf dem Rest des Codes suchen.

Remembering, wie portable C ist, kann es nicht immer auf einer Standard-Plattform wie Windows oder Unix laufen. Vielleicht ist es einig Mikro-Code in Ihrer Waschmaschine auf einer billige, gehackt-Umgebung. Als solches ist es gute Praxis, um sicherzustellen, dass ein Zeiger vor dereferencing es nicht null ist, was zu der Frage geführt haben könnte.

Auch ja, sind Sie richtig. * Argv ist die gleiche wie argv [0] und argv ist sollte durch die Umgebung initialisiert werden, wenn es zur Verfügung gestellt wird.

nur eine Spekulation.

Was passiert, wenn Ihr Professor wird diesbezügliche ??

while(*++argv !=NULL)

    printf("%s\n",*argv);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top