Question

J'ai créé un programme appelé test:

#include<stdlib.h>
#include<iostream>
int main()
{
    std::cout<<system("..\\add\\debug\\add.exe 4 8");
    while(true);
    return 0;
}

add.exe est composé de

#include<stdlib.h>
int main(int argc,char **argv[])
{
    int n=((unsigned)argv[1]);
    int m=((unsigned)argv[2]);
    return(n+m);
}

alors quand je lance le test, je reçois

6841420

La tentative visait à ce que le test soit ajouté aux paramètres 4 et 8, et que add renvoie la somme de ces valeurs (12), puis que test l’affiche à l’écran. Comment ai-je obtenu le 6841420 et comment puis-je le réparer?

Était-ce utile?

La solution

Le problème est que vous convertissez une valeur de pointeur en entier. Les arguments seront transmis à votre programme sous forme de chaînes de style C (const char*). Vous devez d’abord les convertir en chaîne à l’aide d’une API comme atoi.

#include<stdlib.h>
int main(int argc,char *argv[])
{
    int n= atoi(argv[1]);
    int m= atoi(argv[2]);
    return(n+m);
}

MODIFIER

Comme d'autres l'ont souligné, vous devez également effectuer une vérification des erreurs pour vous assurer que deux paramètres sont réellement transmis au programme.

Autres conseils

Votre add.exe lance des pointeurs sur des chaînes vers des entiers non signés, il ajoute donc leurs positions en mémoire plutôt que les chiffres.

Utilisez sscanf (ou, comme suggéré dans une autre réponse, atoi - c'est probablement plus facile).

Cela peut convenir en tant que jouet, mais en tant que FYI, vous ne pouvez pas compter sur le fait de pouvoir renvoyer toute la gamme d’entiers de main (). Premièrement, system () utilise différentes valeurs en tant que sentinelles (-1 et 127, par exemple), de sorte que vous ne pourrez pas faire la différence entre une exécution échouée et un résultat légitime de l'une de ces valeurs. Deuxièmement, les shells peuvent limiter la plage de la valeur de retour à 8 bits seulement (en utilisant les bits restants pour des informations d'état supplémentaires).

Les réponses à propos de l'utilisation de atoi () ou de sscanf () pour convertir les éléments argv [] des chaînes en entiers réels sont exactes.

Il existe cependant un autre problème avec votre scénario de test. La valeur de retour de system() est un statut de sortie pour le processus qui a été exécuté, ce qui dépend largement de la plate-forme. Cependant, sur la plupart des plates-formes, les choses sont arrangées de sorte que la valeur 0 signifie que la commande a fonctionné correctement, puis appelée exit(0) elle-même. Windows se conforme à cela beaucoup.

La ligne cout<<system(...) affiche cette valeur d'état. Sur de nombreuses plates-formes (notamment celles compatibles POSIX), si le processus s’exécute sans terminaison anormale, l’octet de poids faible du code d’état sera égal à zéro et l’octet de poids fort correspond à la valeur transmise à exit() en supposant que cette valeur est égale ou inférieure à 255.

Utiliser le statut de sortie pour communiquer beaucoup plus d'informations que le simple succès / échec du processus parent dépend fortement de la plate-forme et il existe de bien meilleures façons de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top