Frage

Wie kann ich in der folgenden Eingabe in meinem RPN-Rechner lesen, so dass es den Bediener egal wird, was Ordnung?

2
2+
4

Ab jetzt meinem Scanf sieht nur das erste Zeichen in der Zeichenfolge und ich kann dies nur tun:

2
2
+
4

Ich versuche auch vs Floating-Point-Modus eine Option für die ganze Zahl hinzuzufügen. (Ex., Wenn 'i' eingegeben wird, in Gleitkomma- und vice versa funktionieren.)

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

int *p;
int *tos;
int *bos;

void push(int i);
int pop(void);

int main (void)
{
int a, b;
//float c, d;
char s[80];
//char op;  //declare string of 80 chars

p = (int *) malloc(MAX*sizeof(int)); //get stack memory
if (!p){
 printf("Allocation Failure\n");
 exit(1);
 }
 tos = p;
 bos = p + MAX-1;

 printf("\nRPN Calculator\n");
 printf("Enter 'i' for integer mode\n");
 printf("Enter 'f' for floating point mode\n");
 printf("Enter 'q' to quit\n");

 do {
 printf("> ");
 // gets(s);
 // scanf("%s", s);  //read integer
 scanf("%s", s);
 // switch (*s) {


 switch(*s) {
   case 'i':
       printf("(Integer Mode)\n");
   break;
   case 'f':
       printf("(Floating Point Mode)\n");
   break;
   case '+':
       a = pop();
       b = pop();
       printf("%d\n", a+b);
       push(a+b);
   break;
   case '-':
       a = pop();
       b = pop();
       printf("%d\n", b-a);
       push(b-a);
       break; 
  case '*':
       a = pop();
       b = pop();
       printf("%d\n", a*b);
       push(a*b);
  break;
  case '/':
       a = pop();
       b = pop();
       if(a == 0){
         printf("Cannot divide by zero\n");
  break;
  }
       printf("%d\n", b/a);
       push(b/a);
  break;
  case '.':
       a = pop();
       push(a);
       printf("Current value on top of stack: %d\n", a);
  break; 
  default:
       push(atoi(s));
  }

 } while (*s != 'q');

 return 0;
}


 // Put an element on the stack

 void push (int i)
 {
 if (p > bos){
   printf("Stack Full\n");
 return;
 }
  *p = i;
  p++;
 }

// Get the element from the top of the stack

int pop (void)
{
 p--;
 if(p < 0) {
    printf("Stack Underflow\n");
 return 0;
 }
 return *p;
 }
War es hilfreich?

Lösung

Ihre scanf liest die gesamte Zeichenfolge. Es ist der folgende Schalter, dass die Richter nach dem ersten Zeichen und verfehlt das + in 2+.

Um es zu verbessern Sie die strtol Funktion nutzen zu können. Es wird eine ganze Zahl aus dem String und Rückkehr zu Ihnen die Lage zu analysieren, wo die ganzen Zahl beendet -. Wenn es das ist noch nicht das Ende der Zeichenfolge, kann es dort ein Operator sein

Eine ähnliche Funktion für Gleitkommazahlen strtod ist.


Hier ist ein Beispielcode von strtol für Ihr Beispiel:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
    char* input = "25+";
    char* endptr;

    int val = strtol(input, &endptr, 10);

    if (*endptr == '\0')
    {
        printf("Got only the integer: %d\n", val);
    }
    else
    {
        printf("Got an integer %d\n", val);
        printf("Leftover: %s\n", endptr);
    }


    return 0;
}

Andere Tipps

Ich bin mir nicht sicher, ob ich voll und ganz Ihre Frage verstanden, aber man konnte die Zeichenfolge wie folgt durchlaufen:

for(i = 0; i < strlen(s); i++)
{
   // Here comes your switch section like this
   switch(s[i]) {
    .....
   }

}

auch Denken Sie daran, umfassen string.h.

Ich verstand nicht, Ihren Code wirklich.

Wenn erwarten, dass die Benutzer ein Zeichen jedes Mal eingeben, ich meine ein Zeichen + eingeben, sollten Sie ein einfaches Zeichen anstelle von char []. Und wenn Sie so tun, als eine Zeichenfolge zu verwenden, sollten Sie es empfangen und analysieren sie sagte pzico. Man könnte so etwas tun. Das Problem würde bei der Behandlung von Zahlen mit mehreren Ziffern, aber denke ein bisschen Sie dieses Problem beheben kann. Ich schrieb einen Versuch, aber ich bin ziemlich sicher, es wird nicht an die Arbeit.

printf ( "\ NRPN- Rechner \ n");
printf ( "Enter 'i' für die ganze Zahl Modus \ n");
printf ( "Enter 'f' für Punkt-Modus floating \ n");
printf ( "Geben Sie 'q' beenden \ n");
scanf ( "% c", s);

Schalter (* s) {

case 'i':  
    printf("(Integer Mode)\n");  
break;  
case 'f':  
    printf("(Floating Point Mode)\n");  
break;  
case 'q':  
    printf("Bye Bye\n");  
    return;  
break;  

} printf ( „Geben Sie den Ausdruck ein Zeichen jedes Mal \ n“);

Sie {

scanf("%c", s);   
switch(s) {   
    case '+':   
        a = pop();      
        b = pop();     
        printf("%d\n", a+b);      
        push(a+b);
    break;
    case '-':
        a = pop();
        b = pop();
        printf("%d\n", b-a);
        push(b-a);
    break; 
    case '*':
        a = pop();
        b = pop();
        printf("%d\n", a*b);
        push(a*b);
    break;
    case '/':
        a = pop();
        b = pop();
        if(a == 0){
            printf("Cannot divide by zero\n");
            break;
        }
        printf("%d\n", b/a);
        push(b/a);
    break;
    case '.':
        a = pop();
        push(a);
        printf("Current value on top of stack: %d\n", a);
    break; 
    default:
        a = pop()*10+atoi(s);
        push(a);
}  

} while (s = 'q'!);

Ein weiteres Problem in Ihrem Code ist in der Pop-Funktion. Was tun Sie mit diesem Test zu tun:

if (p <0) {
    printf ( "Stack Unterschreitung \ n");
    return 0;
}

Sie erwarten Ihre Zeiger die Adresse zu erreichen: 0?

Auf jeden Fall hoffe ich nicht Ihre Hausaufgaben sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top