Duda con argc y argv

Estoy aprendiendo a programar en C y tenía una duda con argc y argv. Te explico, estaba haciendo un ejercicio sobre C muy básico, es este:
/* Toma dos argumentos de la línea de comandos,
Los multiplica y devuelve el resultado por pantalla */
#include <stdio.h>
int main (int argc, char * argv[])
{
    int n,m;
    // TODO opcional: verificar que hay tres argumentos
    // y si no los hay lanzar una ayuda de uso por pantalla
    // TODO
    sscanf( );
    sscanf( );
    // TODO imprimir resultado
    return 0;
}
Esta es la solución que pongo yo:
#include <stdio.h>
int main (int argc, char * argv[])
{
    int n,m;
    if(argc!=3){
        printf("No está bien");
    }else{
        printf("Introduce dos números:");
        scanf("%d, %d", &n, &m);
        printf("El resultado es %d", n*m);
    }
    return 0;
}
Pues cuando le doy a ejecutar siempre se va hacia "No está bien" y nunca me deja introducir los dos números.
¿Qué está fallando?.
Respuesta
1
(xxxxxx) 8.
Cuando estas trabajando con argc y argv debes ejecutar el programa desde una consola o línea de comandos para que puedas colocar desde allí los argumentos.
Por ejemplo: si tu programa se llama prueba.c Y lo compilas quedando prueba.exe, lo que debes escribir en la línea de comandos es algo como c:\>prueba 25 10 y el programa te responderá 250.
Argc te cuenta la cantidad de cosas que escribes. En este ejemplo prueba es la 1, 25 es la 2 y 10 es la 3. por eso preguntas si argc es distinto de 3.(argc! =3)
Por lo tanto, es improcedente que coloques los scanf en tu código. El programa jamás te va a preguntar durante la ejecución ya que toma los valores desde el momento en que lo invocas. (Ejecutas)
Y en el código deberías colocar algo así como n=argv[1] y m=argv[2] (lo más seguro tienes error de typecast y vas a tener que transformar los argv "que son cadenas" a datos tipo entero antes de asignar).
Tu código podría ser algo así::
#include <stdio.h>
int main (int argc, char * argv[])
{
    if(argc!=3){
        printf("No está bien");
    }else{
      printf("El resultado es %d", atoi(argv[1]*atoi(argv[2]);
    }
    return 0;
}

2 respuestas más de otros expertos

Respuesta
1
Claro, porque estás ejecutando el programa sin mandarle argumentos. Lo que estás haciendo ahí es pedir los números y tratar de capturarlos en el else.
Cuando la función principal void main( ) no tiene argumentos. Para ejecutar el programa una vez que el compilador haya generado el archivo ejecutable, simplemente tecleas el nombre del programa (o sea del archivo. exe), si estás haciéndolo en la línea del msdos. Si estás usando windows, entonces lo ejecutas haciendo click con el mouse en el nombre del programa.
Cuando usas la función principal int main(int argc, char *argv[]) como tiene argumentos entonces al ejecutarlo en la línea de comandos del MSDOS o unix, después de compilarlo, tendrás que teclear el nombre que le hayas puesto al programa, un espacio y el primer valor otro espacio y el segundo valor. No hay entonces necesidad de usar scanf. Eso es mandar los argumentos en línea o sea mandárselos al programa para que se ejecute con ellos.
Encontré un ejemplo que puedes ver en:
http://codigomaldito.blogspot.com/2005/12/parmetros-por-lnea-de-comandos-argc-y.html
La funcion principal para tu programa quedaría  así:
main(int argc, char *argv[]) 
{
  if (argc != 3) cout << "Error";
  else
    {
      int a,b;
      a = atoi(argv[1]);
      b = atoi(argv[2]);
      cout << a*b;
    }
  return 0;
}
Y una vez compilado, suponiendo que quieres ejecutarlo para multiplicar 45 por 23 y que el nombre del programa sea producto.c
Para ejecutarlo tendrás que hacerlo desde la línea de comandos del MSDOS, tecleando
Producto 45 23
Si algo no está claro
Respuesta
1
Primero te agregue la opción system("pause"); para generar una pausa en la consola y poder ver el resultado correctamente.
Cuando compilas puedes hacerlo de modo paso a paso y así ver que valor tienen las variables en el runtime, en tu caso te sucede eso porque la condición es verdadera o sea estas diciendo SI ARGC ES DIFERENTE DE 3 ENTONCES IMPRIME EN PANTALLA ESTE CARTEL NO ESTA BIEN SINO ...
En otras palabras tu condición funciona perfectamente, porque argc es distinto de 3 de hecho es igual 1 porque solo esta presente el nombre de archivo y no hay presencia de ningún parámetro adicional
int n,m;    
if(argc!=3)    
{        
        printf("No está bien");    
}    
else    
{        
        printf("Introduce dos números:");        
        scanf("%d, %d", &n, &m);        
        printf("El resultado es %d", n*m);    
}
        system("pause");        
return 0;
}
Mira este ejemplo para que entiendas mejor el uso de ARGC
#include <stdio.h>
main(int argc, char* argv[])
{
int i;
printf("argc = %d\n", argc);
for (i = 0; i<argc; i++)
printf("argv[%d] = %s\n", i, argv);
}
¿Qué es ARGC y ARGV?
Los parámetros de Linea de comandos son típicamente usados para especificar instrucciones o informaciones a una aplicación antes de que esta se ejecute.
Por ejemplo si abres el la linea de comandos(ejecutar->cmd) y escribes notepad.exe MyArchivo.txt le acabas de dar el parámetro MyArchivo.txt a la aplicación notepad.exe (lo que causara que intente abrir dicho archivo)
En c++ los parámetros de lineas de comandos son entendidos usando dos variables:
Argv que es un array de punteros c-string yt argc que especifica el numero de elementos dentro argv o el numero de punteros c-string apuntando por argv.
El primer argumento pasado sera el nombre del programa, usualmente argv[0]
El programa siguiente toma 2 argumentos el primero un filename ficticio y el segundo una opción ficticia. Así que pon el ejecutable en c:\ y navega hasta ahí desde tu linea de comandos. Una vez ahí ejecutalo usando el nombre ejecutable y luego las 2 opciones. Osea tecleas main.exe -myfilename -myoption luego presionas enter. Debería imprimirte en pantalla las 2 opcionesque tu pasaste. Así que en total este programa va a recibir 3 opciones. El Nombre del Programa el filename y la opción. Si no recibe las 2 opciones (ya se a porque reciba más o menos) entonces mostrara la ubicación del ejecutable, en caso de recivirlas te las devolverá en pantalla.
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <iostream>
#include <limits>
#pragma hdrstop
//---------------------------------------------------------------------------

#pragma argsusedint main (int argc, char * argv[])
{    
 using namespace std;
        
//dejo algunos espacios en blanco (estetica ;-)        
cout <<endl<<endl<<endl;

if ( argc != 3 )  // argc debe ser 2 para una ejecucion correcta        
{              
// imprimimos argv[0] asumiendo que es el nombre del programa
cout << "Ubicacion: " << argv[0] << " <filename> <option>\n ";
}
else
{
cout << argv[1] << " - argv[1]" << endl; cout << argv[2] << " - argv[2]" << endl;
}
      
 cout <<endl<<endl<<endl;        
system("pause");
 
 return 0;
}
Despues de hablar tanto ufff hasta yo mismo me aburro podemos entrar en materia, tu codigo llamando el ARGC esta bien solo debes compilar, y ejecutar desde el CMD poniendo una o mas opciones por ejemplo, yo lo compile y lo nombre test.exe, lo puse en c:\ y lo ejecute de la siguiente manera c:\test.exe -parametro1 -parametro2 asi tu condicion argc!=3 se cumple perfectamente, los cálculos matemáticos están un poco mal (quien dice un poco dice dos pocos jejejeje) pero eso te lo dejo a ti ok
Espero haber sido de ayuda, un saludo fraternal en F.L.T.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas