[ Foro de C ]
Buenas he llegado a lo que creo que es la parte más dificil del curso.
Estoy intentando hacer el siguiente ejercicio:
/*Crear un programa llamado ?suma?, que calcule (y muestre) la suma de dos números
que se le indiquen como parámetro. Por ejemplo, si se teclea ?suma 2 3? deberá
responder ?5?, y si se teclea ?suma 2? deberá responder ?no hay suficientes datos*/
Mi fuente es el siguiente:
int main(int argc, char* argv[])
{
int n1, n2;
if(argc!=3)
printf("No hay suficientes datos.");
else
{
sscanf(argv[1],"%d", &n1);
sscanf(argv[2], "%d", &n2);
printf("%d", n1 + n2);
}
return 0;
}
Si hago esto el programa funciona bien pero siempre que lo ejecuto sale no hay suficientes datos.
He pensado que logicamente es porque no hemos pedido ningún dato al usuario asi que lo he modificado de la siguiente forma:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
int n1, n2;
printf("Introduce la operacion a realizar");
gets(argv[0]);
printf("Introduce el primer numero");
gets(argv[1]);
printf("Introduce el segundo numero");
gets(argv[2]);
if(argc!=3)
printf("No hay suficientes datos.");
else
{
sscanf(argv[1],"%d", &n1);
sscanf(argv[2], "%d", &n2);
printf("%d", n1 + n2);
}
return 0;
}
Ahora si compilo no da problemas pero al ejecutar puedo introducir la palabra suma sin problemas pero al introducir el primer numero aparece:
Segmentation fault (core dumped)
No se porque ocurre esto.
Alguna ayuda para solucionarlo?
La primera solución es la correcta. La segunda no, porque se trata de no pedir al usuario de forma explícita, sino de tomar datos de la línea de comandos. ¿Seguro que lo estás ejecutando desde línea de comandos? Recuerda que debes teclear
suma 2 4
Ahora he entendido lo que hace la orden argc y argv[]. Antes no me habia quedado claro.
Ya lo ejecuto desde la linea de comandos y funciona bien.
Pero en este momento tengo un problema en el siguiente ejercicio que dice:
Crear una calculadora básica, llamada ?calcula?, que deberá sumar, restar, multiplicar o
dividir los dos números que se le indiquen como parámetros. Ejemplos de su uso sería
?calcula 2 + 3? o ?calcula 5 * 60?.
Mi codigo es el siguiente:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int n1, n2;
printf("El numero de datos introducidos es %d.\n", argc);
if(argc!=5)
printf("No se han introducido suficientes datos.");
else
{
sscanf(argv[2], "%d", &n1);
sscanf(argv[4], "%d", &n2);
switch(argv[3][0])
{
case '+':printf("la suma es %d.", n1 + n2);
break;
case '-':printf("La resta es %d", n1 - n2);
break;
case '*': printf("La multiplicación es: %d",n1 * n2);
break;
case '/': printf("La división es %f.", (float)n1/ (float)n2);
break;
default: printf("operacion no reconocida");
}
}
return 0;
}
Todo funciona perfectamente pero si introduzco la operacion multiplicacion no lo hace bien.
es decir si introduzco calcula 2 + 3 lo hace bien y sin problemas.
Pero sin embargo si pongo calcula 2 * 3 me dice que el numero de datos introducidos es 13 y por tanto no realiza la operacion.
¿alguna explicación? como solucionar el problema. Gracias.
Como aclaracion debo decirte que el numero de datos introducidos tiene que ser 5 porque argv[0] lo toma como el nombre de programa por eso en este caso calcula 2 + 3 son 5 datos y no 4 como aparece en tu libro.
Según he leido esto depende del compilador yo utilizao geany para linux ubuntu.
No entiendo a qué te refieres. Los datos en ese ejemplo son 4:
calcula 2 + 3
El dato 0 es el nombre del programa y ése, en este ejemplo, es "calcula" (doy por sentado que el fuente se llama "calcula.c" y el ejecutable es "calcula.exe" en Windows o "calcula" en Linux).
El dato 1 es el primer parámetro real, y en ese ejemplo es "2"
El dato 2 es "+"
El dato 3 es "3"
¿No estarás usando la palabra "calcula" como un parámetro más (y no debería serlo)? En Linux realmente teclearías algo como
./calcula 2 + 3
Lo de que falle con el asterisco depende del sistema operativo. Por ejemplo, si usas Linux, el intérprete de comando "bash" (que es el habitual) tiene el asterísco como símbolo reservado. En ese caso podrías "engañarle" usando la secuencia de escape "\*" en vez de sólo "*". Es decir, lanzarías el programa haciendo
./calcula 2 \* 3
(no hay problemas con los demás símbolos: ni "+", ni "-", ni "/" son símbolos reservados).
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)