2011-02-09 22 views
5

Tengo un tipo de calculadora en C++ que debe aceptar argumentos cuando se ejecuta. Sin embargo, cuando ingreso 7 como argumento, puede llegar a ser 10354 cuando se coloca en una variable. Aquí está mi código:argumentos enteros para C++

#include "stdafx.h" 
#include <iostream> 

int main(int argc, int argv[]) 
{ 
    using namespace std; 
    int a; 
    int b; 
    if(argc==3){ 
     a=argv[1]; 
     b=argv[2]; 
    } 
    else{ 
     cout << "Please enter a number:"; 
     cin >> a; 
     cout << "Please enter another number:"; 
     cin >> b; 
    } 
    cout << "Addition:" << a+b << endl; 
    cout << "Subtaction:" << a-b << endl; 
    cout << "Multiplycation:" << a*b << endl; 
    cout << "Division:" << static_cast<long double>(a)/b << endl; 
    system("pause"); 
    return 0; 
} 
+0

Siempre compile su código con las advertencias máximas habilitadas. '-Wall' cuando se usa gcc. Sospecho que el compilador le habría impedido cometer este error con una advertencia acerca de convertir un puntero a un número entero. –

+0

@deft_code? Donde la conversión de puntero a entero? 'main' simplemente tiene la firma de tipo incorrecta. –

+0

Para su información, la mayoría de los matemáticos requieren verificar el denominador para el cero antes de la división. Escuché que era ilegal. Creo que el término de programación es "Comportamiento indefinido". El programa generará una señal o excepción. Los mundos pueden desmoronarse. ¿Quién sabe? –

Respuesta

19

¿Dónde conseguiste int argv[]? El segundo argumento para main es char* argv[].

Puede convertir estos argumentos de línea de comando de cadena a entero utilizando atoi o strtod.

Por ejemplo:

a=atoi(argv[1]); 
    b=atoi(argv[2]); 

Pero no se puede simplemente cambiar el tipo de parámetro, ya que el sistema operativo se va a dar sus argumentos de línea de comandos en forma de cadena, le guste o no.

NOTA: Debe #include <stdlib.h> (o #include <cstdlib> y using std::atoi;) para utilizar la función atoi.


Si desea comprobación de errores, utilice strtol en lugar de atoi. Usarlo es casi tan fácil, y también le da un puntero a la ubicación en la cadena donde termina el análisis. Si eso apunta a la NUL de terminación, el análisis fue exitoso. Y, por supuesto, es bueno que verifique argc para asegurarse de que el usuario proporcionó suficientes parámetros y evite intentar leer los parámetros que faltan en argv.

+0

Otro método para convertir de cadena a entero es usar 'std :: istringstream'. –

+1

@Thomas: si necesita manejar separadores de miles y símbolos de moneda y cosas así, sí. De lo contrario, es solo 5 veces más código y 20 veces más lento. –

+0

Motivo del voto a favor? –

2

El segundo argumento en general debería ser char* argv[] o char** argv. Luego debe convertirlos al int.

4

La firma de la función es int main(int argc, char *argv[]). argv es una matriz de apuntadores de cuerda.

Si el argumento es 7, tendrá la forma de una cadena ("7"). Use atoi() para convertirlo al número 7.

+0

Gracias. No sabía acerca de esa función. Cuando utilicé static_cast y los argumentos int argc y char * argv [], se produciría un error. – Rob

+0

@Rob: si estuvieras emitiendo char * a int, alégrate de que tu compilador no lo permita. Si pudieras compilarlo, tendrías un programa con un error grave. Una cadena es una matriz de caracteres. El valor del carácter '7' no es 7. Si desea realizar operaciones matemáticas con 7, debe convertir la cadena. –