11
votes

Pourquoi vérifier si (* argv == null)?

Dans la classe de structures de données que je prends actuellement, nous avons été chargés d'écrire un robot Web en C ++. Pour nous donner un début de tête, le professeur nous a fourni un programme pour obtenir la source d'une URL donnée et un simple analyseur HTML pour éliminer les étiquettes. La fonction principale de ce programme accepte des arguments et utilise donc argc / argv. Le code utilisé pour vérifier pour que les arguments est la suivante:

// 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);
}


5 commentaires

Notez que argv n'est pas un tableau, mais un pointeur. Cela signifie que vous pouvez parfaitement bien dire argv ++ à itérer à travers les options. Vous n'avez pas à modifier la valeur de * argv .


Par curiosité, quelle était la raison donnée par votre professeur quand vous l'avez posée à ce sujet?


Maintenant, 5 ans plus tard, je crains que je ne me souvienne vraiment pas. Il semble que je me souvienne vaguement de demander à mon TA et que le raisonnement étant la même chose que dans les commentaires de la réponse acceptée (voir la modification de la question), mais je pouvais faire cela et je me souviens simplement de tout faux. : P


Je sais que c'est vraiment tard, mais simplement comme une note, vous pouvez facilement analyser les options de ligne de commande avec GETOPT () .


Pas sûr que le marquage de cela en tant que duplicata a été justifié étant donné que cette question a été posée et a répondu 3 mois avant la "duplication" liée. (En fait, il y a 7 ans à ce stade> _>)


4 Réponses :


10
votes

argc code> vous fournira le nombre d'arguments de ligne de commande passés. Vous ne devriez pas avoir besoin de vérifier le contenu de argv code>. Voir aussi s'il n'y a pas assez d'arguments.

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


10 commentaires

Je sais cela, le code ci-dessus est le code qui nous a été donné par notre professeur. Personnellement, je vérifie toujours contre Argc. Je demande ce qu'est * argv == null vérifie en réalité? Mon impression était que c'est la même chose que la vérification argv [0] == NULL, qui, aussi loin que je sache, c'est impossible, alors pourquoi vérifier?


@Shaun: Oui, * argv est identique à argv [0] . Ceci n'est normalement pas possible lorsque vous exécutez l'application d'une coque normale. Mais je pense Il peut être possible si vous exécutez un processus directement à partir d'un autre programme à l'aide de EXEC appelez le système et en passant les matrices manuellement.


Je pensais que argv [0] contenait toujours le nom du programme, alors pourquoi vérifier si c'est NULL?


@Shaun: Eh bien, ce n'est pas magique qui place le nom du programme dans argv . La coquille met cela dans la matrice quand il s'agit de frayer votre processus. Il peut être possible (dépend de la plate-forme) pour fabriquer manuellement un processus de lanceur qui ne transmet pas un tel argument à votre programme.


@Shaun: Peut-être que votre professeur est ... faux?


Le professeur écrit à la norme C ++. Bien entendu, il se peut que son code repose ailleurs sur des fonctionnalités spécifiques à la mise en œuvre (telles que certaines API pour la connexion à un réseau) qui, à son arrivée, limitent le code aux plates-formes garanties, hors de la gentillesse de leurs cœurs plutôt que de toute nécessité imposée par la norme, que argv [0] est non nulle.


@Shaun, le programme peut avoir incrémenté argv de sorte qu'il pointe maintenant sur un pointeur NULL. Voir la réponse de Steve.


@Mehrdad: D'accord, je peux croire qu'il peut être possible de rendre argov [0] null si vous le faites intentionnellement. Il suffit d'avoir toujours exécuté nos programmes sur Windows ou Solaris, jamais via un lanceur personnalisé et n'ayant jamais vu cela chèque d'entre eux, cela m'a frappé aussi étrange.


@Shaun: Il est prudent de supposer que c'est le cas dans normal circonstances. Mais puisque argc est spécifiquement fourni pour compter le nombre d'arguments, pourquoi risqueriez-vous de ne pas le faire? Ajouter un si instruction qui vérifie que argc n'est pas une si grosse affaire.


@Mehrdad: Je suis d'accord, mais je n'ai pas écrit le code. :)



4
votes

Se souvenir de la manière dont le portable C est, il pourrait ne pas toujours fonctionner sur une plate-forme standard comme Windows ou UNIX. C'est peut-être un micro-code dans votre machine à laver qui s'exécute sur un environnement bon marché et piraté. En tant que tel, c'est une bonne pratique de s'assurer qu'un pointeur n'est pas nul avant la déséroférance, ce qui aurait pu conduire à la question.

même si, vous êtes correct. * ARGV est identique à ARGV [0] et argv est supposé être initialisé par l'environnement, s'il est fourni.


1 commentaires

C'est peut-être un micro-code à l'intérieur de votre lave-linge '- idéal, maintenant j'attends le message "Désolé, vous devez mettre à jour" Adobe Flash "à la version la plus récente pour entrer le cycle de rinçage."



12
votes

3.6.1 / 2:

si argc est non nul ces arguments doit être fourni dans ARGV [0] si ... et argv [0] sera le pointeur au caractère initial d'un NTMBS qui représente le nom utilisé pour invoquer le programme ou "". La valeur de argc doit être non négatif. La valeur de argv [argc] doit être 0.

mettre l'accent sur la mine. Argc n'est garanti que non négatif, pas non-zéro.

Ceci est à l'entrée à la main. Il est également possible que // forme modifie la valeur de argv ou le contenu de la matrice pointe sur. Ce n'est pas entièrement inoubliable dans le code de manipulation des options pour transférer des valeurs hors ARGV, car elle les traite. Le test de * argv == null peut donc vérifier s'il reste ou non des arguments de ligne de commande, une fois les options supprimées ou ignorées. Vous devriez regarder le reste du code.


0 commentaires

4
votes

juste une spéculation.

Et si votre professeur se réfère à cela ?? xxx


0 commentaires