Domanda

Ho creato un programma chiamato test:

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

add.exe è costituito da

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

quindi quando eseguo test, ottengo

6841420

Il tentativo era di far eseguire il test con i parametri 4 e 8, e per aggiungere per restituire la somma di quei valori (12) e quindi test avrebbe visualizzato quello sullo schermo. Come ho ottenuto 6841420 e come posso ripararlo?

È stato utile?

Soluzione

Il problema è che stai convertendo un valore di puntatore in un numero intero. Gli argomenti verranno passati al tuo programma come stringhe di stile C (const char*). Devi prima convertirli in una stringa usando un'API come atoi.

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

Modifica

Come altri hanno sottolineato, dovresti anche fare qualche controllo degli errori per assicurarti che ci siano effettivamente 2 parametri passati al programma.

Altri suggerimenti

Il tuo add.exe sta lanciando puntatori su stringhe in interi senza segno, quindi sta aggiungendo le loro posizioni in memoria piuttosto che i numeri.

Usa sscanf (o, come suggerito in un'altra risposta, atoi - probabilmente è più facile).

Questo può essere OK come giocattolo, ma come FYI, non puoi contare sul fatto di poter restituire l'intero intervallo di numeri interi da main (). Innanzitutto, system () utilizza vari valori come sentinelle (-1 e 127, ad esempio), quindi non si sarebbe in grado di dire la differenza tra un'esecuzione non riuscita e un risultato legittimo di uno di questi valori. In secondo luogo, le shell possono limitare l'intervallo del valore restituito a soli 8 bit (utilizzando i bit rimanenti per ulteriori informazioni sullo stato).

Le risposte sull'uso di atoi () o sscanf () per convertire elementi argv [] da stringhe a numeri interi effettivi sono esatte.

Tuttavia, c'è un altro problema con il tuo test case. Il valore di ritorno di system() è uno stato di uscita per il processo eseguito, che dipende da una piccola piattaforma. Tuttavia, sulla maggior parte delle piattaforme, le cose sono organizzate in modo tale che il valore 0 significhi che il comando è andato bene e alla fine si è chiamato exit(0) stesso. Windows è molto conforme.

La riga cout<<system(...) sta stampando quel valore di stato. In molte piattaforme (in particolare quelle compatibili con POSIX) se il processo è stato eseguito senza una terminazione anomala rispetto al byte basso del codice di stato sarà zero e il byte alto sarà il valore passato a exit() supponendo che il valore sia 255 o inferiore.

L'utilizzo effettivo dello stato di uscita per comunicare molte più informazioni rispetto al solo esito positivo / negativo al processo padre dipende in larga misura dalla piattaforma e ci sono modi migliori per farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top