2016-09-11 4 views
-3

Программа считывает текстовый файл с содержимымСтек C++. Один из элементов не отображается

A DPX 

A QRT 

Толчки DPX и QRT на стеке. Но при отображении stack {void show()} он не отображает стек [0]. Не знаю Почему !? Он помещается в стек. элемент стека [0] отображаемая в толчке(), но не в шоу()

const int MAX = 10 ; 
struct car 
{ 
     char * lPlate; 
     int moves; 
}; 

class garage 
{ 
    private : 

     char * stack[MAX] ; 
     int top ; 

    public : 
      garage() 
      { 
       top = -1 ; 
      } 

     void arrive(struct car c) 
     { 
      push(c.lPlate); 
     } 

     void depart(struct car c) 
     { 

     } 

     void push (char * item) ; 
     char* pop() ; 
     void show(); 
} ; 

void garage:: push (char* item) 
{ 
    if (top == MAX - 1) 
     cout << endl << "Sorry. Parking lot is full" ; 
    else 
    { 
     top++ ; 
     strcpy(stack[top] , item) ; 
    } 
    cout<<"In push: "<<stack[top]; 
} 

char * garage:: pop() 
{ 
    if (top == -1) 
    { 
     cout << endl << "Parking lot empty is empty" ; 
     return NULL ; 
    } 

    return stack[top--] ; 
} 

void garage:: show() 
{ 
    cout<<" \nParking Lot Status:\n"; 
    if(top == -1) 
    { 
     cout << endl << "Parking lot is empty" ; 
     return ; 
    } 
    int i=top; 
    cout<<"In show "<<stack[0]<<endl; 
    while(i>-1) 
    { 
    cout<<stack[i]<<endl; i--; 
    } 
} 
int main() 
{ 
    clrscr(); 
    char *action; 
    garage g; 
    ifstream fin("TEST"); 
    if(!fin){cout<<"Cannot open i/p file \n\n";return 1;} 
    char str1[80],str2[40]; int i,j; 
    while(!fin.eof()) 
    { 
    fin.getline(str2,MAX); 
    struct car c;//create a car obj 
    char * pch; 
    pch = strtok (str2," ,.-");//split string on getting <space>/<,>/<.>/<-> 
    while (pch != NULL) 
    { 
     action=pch; 

    pch = strtok (NULL, " ,.-"); 
    c.lPlate=pch; 
    pch=NULL; 
    cout<<"\nAction: "<<action<<" lPlate: "<<c.lPlate<<"\n"; 
     switch(*action) 
     { 
     case 'A': 
      g.arrive(c); 
      break; 
     case 'D': 
      g.depart(c); 
      break; 
     } 
    } 
    cout<<"\n\n"; 
    } 

     fin.close(); 
     cout<<"\n"; 
     g.show(); 
    getch(); 
} 
+2

TL; DR; используйте отладчик. – Amit

+0

б/у. все работает нормально. просто стек [0] не отображается – Coder

+0

Это слишком долго. Следуйте [this] (http://stackoverflow.com/help/mcve) и обратите внимание на последнюю ссылку, [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to -debug-small-programs /) (Удачи! :-) – Amit

ответ

0

Массив

char * stack[MAX] ; 

не инициализирован. Это массив из 10 (MAX) указателей. Каждый указатель не инициализируется.

В методе поп-музыке, перед копированием элемента в стеку, инициализация «верхний» элемент стека

top++ ; 
int length = strlen(item)+1; //+1 for null terminating character 
stack[top] = new char[length]; //allocate memory 
strncpy(stack[top] , item, length); //prefer strncpy 

После считывания файла

A DPX 
A QRT 

Это приведет в массиве которая выглядит примерно так

stack array

Не e

  • Серые предметы остаются неинициализированными.
  • Avoid strcpy because it can cause an overflow. Если вы должны использовать указатели, предпочитайте strncpy.
  • Память, выделенная для стека, теперь должна быть правильно освобожден, т.е.
    • в методе поп сделать копию элемента из стека и удалить стек [работу] или/и
    • в Разрушитель освободить память, которая не выскочил.

Изменить метод поп что-то вроде этого

int length = strlen(stack[top])+1; 
char *returnItem = new char[length]; 
strncpy(returnItem,stack[top],length); 
delete stack[top]; 
top--; 
return returnItem; 

Кто никогда не называет метод поп нужно освободить память для «returnItem»

В Разрушитель бесплатно все памяти еще то есть

~garage() { 
    for (int i=top; i>=0; i--) { 
     std::cout << "clean up" << i << std::endl; 
     delete stack[i]; 
    } 
    } 
+0

Спасибо. Проблема была неинициализирована. К счастью для других, кроме stack [0], это как-то сработало. Теперь, после инициализации, он работает отлично. Ого !! – Coder

Смежные вопросы