2016-06-03 28 views
0

Ich versuche, ein Programm zu schreiben, wo der Benutzer ein Array Nummern und alphabetische Zeichen einführt. Dann liest das Programm das Array, wenn er eine Nummer sieht, sollte das Programm diese Nummer in einen Stapel schieben. Wenn er jedoch ein alphabetisches Zeichen sieht, wird die letzte gedrückte Zahl angezeigt.Push, Pop und Display-Funktionen von einer Zeichenfolge zu einem Stapel

Bisher habe ich diesen Code:

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

#define MAX 20 

int top, i; 
void push (double stack[], double x, int top) 
{ 
stack[top] = x; 
} 
int pop (double stack[]) 
{ 
    double x; 
    stack [top]=x; 
    return x; 
} 

void display (double stack[],int top) 
{ 
    int i; 
    printf ("\n The stack is: "); 
     for (i=0; i<=top; i++) 
     { 
      printf ("%lf\n",stack[i]); 
    } 
} 

void main() 
{ 
int r; 
int stack[10]; 
char array[10]; 
printf("introduce the numbers"); 
fgets(array,MAX,stdin); 
int l; 
r=strlen(array); 
top=0; 
for (l=0;l<=r;l++) 
{ 
int n; 
if (isdigit(array[l])) 
{ 
    push(stack,array[l],top); 
    top=top+1; 
} 

if (islower(array[l])) 
{ 
     pop(stack); 
     printf("you have popped %d", n); 
     top=top-1; 
} 
} 
display(stack,top); 
} 

Aus irgendeinem Grund das Programm nicht funktioniert, wenn ich 22a einführen die Ausgabe:
you have popped 4194432 The stack is: 50.00000 50.00000

Ich bin besonders interessiert, wie sollte ich Schreibe den Pop, drücke und zeige an, damit dieses Programm funktioniert. Wie kann ich es tun?

Danke

Ich programmiere in C

+1

Sie lesen zwanzig Zeichen '# definiere MAX 20' in ein Array der Größe 10. Außerdem hast du in deiner Schleife 'for (l = 0; l <= r; l ++)', was dazu führen kann, dass i n ein segfault, wenn Sie versuchen, auf 'stack [l]' zuzugreifen, wenn 'l == r'. – ForceBru

+0

Außerdem rufen Sie 'pop (stack)' und _nicht den Rückgabewert_ (!), Also was lässt Sie glauben, dass eine nicht initialisierte Variable 'n' einen nützlichen Wert enthält? – ForceBru

+0

Immer wenn Sie loopen, tun Sie 'for (i = 0; i <= threshold; i ++)', was keinen Sinn ergibt: Sie versuchen, 'threshold + 1' Werte aus dem Array zu bekommen, während Sie Definitiv nur "Schwelle" von ihnen. – ForceBru

Antwort

3

First off, Ihre Variable n, deren Wert Sie drucken, ist uninitialized und enthält unabhängig von Müll, der auf die im Speicher war Moment seiner Entstehung.

Auch, warum drucken Sie es? Ich denke, du wolltest sagen n = pop(stack);, oder? Ansonsten ist dieses Drucken nutzlos.

In Ihrem Code schreiben Sie Schleifen in die falsche Richtung: for (t=0; t<=threshold; t++). Dieser Code wird die Schleife threshold + 1 mal laufen lassen, aber Sie wollen natürlich nur threshold, also tun Sie for (t=0; t<threshold; t++) stattdessen.

Sie sind auch (fgets(array,MAX,stdin);) maximal zwanzig Zeichen in Ihre array lesen, die nur zehn Zeichen halten kann.

Um strlen für ein Array zu verwenden, muss es mit Null enden (Null-Terminator). In Ihrem Code wird array nicht notwendigerweise mit Nullen initialisiert, so verwenden memset(array, 0, 10); vor der Verwendung array:

  1. Docs on memset
  2. Tutorial on for loops
  3. void main() is wrong
  4. What to read to learn C