Wie kann ich einen Operator vs. int in C unter Verwendung von scanf erkennen?
-
23-09-2019 - |
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;
}
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.