Essayer d’obtenir un astérisque * en entrée de la ligne de commande principale

J’essaie d’envoyer des entrées de la ligne de commande à ma fonction principale. L’entrée est ensuite envoyée aux fonctions checkNum etc.

int main(int argc, char *argv[]) { int x = checkNum(argv[1]); int y = checkNum(argv[3]); int o = checkOP(argv[2]); … } 

C’est supposé être une calculasortingce donc par exemple dans la ligne de commande quand j’écris:

 program.exe 4 + 2 

et cela me donnera la réponse 6 (le code correspondant n’est pas inclus).

Le problème est quand je veux me multiplier et que je tape par exemple

 program.exe 3 * 4 

Il semble que cela crée un pointeur (ou quelque chose, pas tout à fait sûr) au lieu de me donner le pointeur de caractère pour le caractère ‘ * ‘.

La question est: est-ce que je peux obtenir que l’entrée ‘ * ‘ se comporte de la même manière que lorsque je tape ‘+’?

Edit: L’écriture "*" dans la ligne de commande fonctionne. Y a-t-il un moyen de ne taper que * ?

Le code est en cours d’exécution sur Windows, ce qui semble faire partie du problème.

Vous pouvez désactiver le contournement du shell si vous ne souhaitez pas utiliser les guillemets simples ( ' ) ou les guillemets doubles ( " ).

Faire

 # set -o noglob 

ou

 # set -f 

(les deux sont équivalents).

pour éteindre la coquille globbing. Maintenant, le shell ne développera pas de globs, y compris * .

Comme @JohnBollinger a écrit dans les commentaires, vous devriez utiliser

 /path/to/program 3 '*' 4 

la façon dont c’est écrit pour le moment.

Mais une explication est clairement requirejse. Cela est dû au fait que le shell parsingra la ligne de commande avant de la transmettre à votre programme. * s’étendra à n’importe quel fichier du répertoire (UNIX) ou similaire (Windows), séparés par des espaces. Ce n’est pas ce dont vous avez besoin. Vous ne pouvez pas le réparer dans votre programme car il sera trop tard. (Sous UNIX, vous pouvez vous assurer que vous vous trouvez dans un répertoire vide, mais cela ne vous aidera probablement pas).

Une autre solution consiste à citer l’argument entier (et à récrire le programme de manière appropriée), c’est-à-dire

 /path/to/program '3 * 4' 

Dans ce cas, vous devrez utiliser strtok_r ou strsep pour parcourir l’argument (unique) passé en le séparant sur les espaces.

La manière dont le shell traite les arguments de ligne de commande est en dehors de la scope et du contrôle de votre programme. Il n’y a rien que vous puissiez mettre dans le programme pour dire au shell d’éviter de suivre son comportement normal en matière de gestion des commandes.

Je suggère toutefois qu’au lieu de compter sur le shell pour la division des mots, votre programme attend l’expression dans son ensemble sous la forme d’un argument unique et qu’il parsing l’parsing. Cela ne vous libérera pas du besoin de guillemets, mais rendra les commandes résultantes plus naturelles:

 program.exe 3+4 program.exe "3 + 4" program.exe "4*5" 

Cela vous aidera également si vous développez votre programme pour gérer des expressions plus complexes, telles que celles contenant des parenthèses (qui sont également importantes pour le shell).