2011-03-31 38 views
5

Estoy tratando de resolver un ejercicio K & R (5.10) que utiliza los argumentos argc y argv.Se supone que es una calculadora de notación polaca que utiliza argumentos de línea de comandos como su 'entrada. Bien, el programa funciona bien para los operadores '+' y '-' pero obtengo errores para '*'. Descubrí que tiene algo que ver específicamente con el símbolo '*', porque si lo reemplazo con otra cosa, el programa funciona. ¿Alguna idea? Gracias.
Nota: No incluí las funciones stack_in, stack_out y print_stack. Creo que son buenas.argv y calculadora de notación polaca

#include <stdio.h> 
#define MAXST 10 
#define NUMBER '1' 

void stack_in(int n); 
int stack_out(void); 
void print_stack(void); 

int main(int argc,char **argv) 
{ 
    char c,k; 

while(--argc>0 && ++argv) 
    while(c=*(*argv)++){ 
     if(c>='0' && c<='9') 
      k=NUMBER; 
     else 
      k=c; 
     switch (k){ 
      int g1,g2; 

      case NUMBER:stack_in(c-'0'); 
        break; 
      case '+':g1=stack_out(); 
       g2=stack_out(); 
       stack_in(g1+g2); 
       break; 
      case '-':g1=stack_out(); 
       g2=stack_out(); 
       stack_in(g2-g1); 
       break; 
      case '*':g1=stack_out(); 
       g2=stack_out(); 
       stack_in(g1*g2); 
       break; 
      default:printf("error on switch \n"); 
       break; 
     } 
} 

print_stack(); 

return 0; 
} 
+1

El '*' se está expandiendo por su caparazón. –

+0

¡Oh, no lo habría adivinado en mil años! ¡Gracias a todos! – kaiseroskilo

Respuesta

6

¡Creo que he hecho ese mismo ejercicio!

De todos modos, es probable que el operador * en la línea de comandos se convierta en "todos los archivos en el directorio", lo que no funcionará. Así que hay que citar que cuando se llama al programa:

# rpmprog 2 3 '*' 

o puede utilizar las copias de las cotizaciones para la mayoría de las cáscaras:

# rpmprog 2 3 \* 
2

El sistema operativo utiliza "*" para un comodín en el comando línea; ningún cambio que realice en su programa afectará esto. Es posible que pueda "escapar" del símbolo en la línea de comandos - es decir,

calculator 2 2 \* 
3

En los depósitos de Linux/UNIX, debe encerrar el * entre comillas simples '*' si no desea que se expandió por tu caparazón.