2013-08-31 3 views
0

Я получаю значения мусора/мусора в качестве вывода, когда моя программа запущена, и отображаемые данные.Почему это дает нежелательную ценность?

Почему это так?

Может кто-нибудь помочь мне понять, как правильно пройти по указателям, а не получать ненужные значения?

Эта программа посвящена созданию стека переменных struct books.

По умолчанию переменная bks не указана и указана при замене b?

bks по-прежнему сохраняет стоимость мусора.

Вот мой код:

#include<stdio.h> 
#include<stdlib.h> 
struct books 
{ 
    int yrpub; 
    char name[100],author[50]; 
}; 
int top=-1; 
int push(struct books b[],int top,int n) 
{ 
    if(top==n-1) 
     return -1; 
    else 
    { 
     ++(top); 
     printf("Enter books info: \n"); 
     printf("Enter name: "); 
     gets(b[top].name); 
     printf("Enter author: "); 
     gets(b[top].author); 
     printf("Enter Year of publish: "); 
     scanf("%d",&b[top].yrpub); 
     return top; 
    } 
} 
void display(struct books b[],int top) 
{ 
    int i; 
    if(top==-1) 
     printf("No books in the stack..."); 
    for(i=0;i<=top;i++) 
    { 
     printf("Details of book %d: \n",i+1); 
     printf("Name: %s\nAuthor: %s\nYear of publish: %d\n",b[i].name,b[i].author,b[i].yrpub); 
    } 
    system("pause"); 
} 

int main() 
{ 
    struct books bks[10]; 
    int ch; 
    system("cls"); 
    printf("Select an option:\n"); 
    printf("1. Push book\n2. Pop book\n3. Peep book\n4. Display all books info\n5. Exit\n"); 
    printf("Enter a choice: "); 
    scanf("%d",&ch); 
    fflush(stdin); 
    switch(ch) 
    { 
    case 1: 
     system("cls"); 
     top=push(bks,top,10); 
     break; 

    case 4: 
     system("cls"); 
     display(bks,top); 
     break; 

    case 5:  exit(0); 

    default: printf("\nWrong choice...Please retry."); 
     long i,j; 
     for(i=0;i<1000000;i++) 
      for(j=0;j<100;j++); 
    } 
    main(); 
} 
+0

'fflush (stdin);' может быть неопределенным поведением –

+1

Если это код C++, то вызов 'main' - это неопределенное поведение. – Caesar

+0

Глобальная переменная, называемая 'top' и параметр функции, называемый' top', является рецептом путаницы. Используйте '-Wshadow', если вы скомпилируете gcc, чтобы предупредить вас о таких проблемах. Если вы не работаете в Windows, 'fflush (stdin)' является неопределенным поведением. –

ответ

2

Каждый раз, когда вы рекурсивный вызов main(), вы создаете новый массив bk.

Информация, введенная в предыдущем вызове main(), скрыта от новой.

  • Итерация человека; рекурсивно, божественно.

В этом контексте отказаться от божественности для человечества. Используйте итерацию - в этом контексте это лучше.

Это ваша основная проблема; могут быть и другие побочные ошибки или другие ошибки.

+0

На самом деле вопрос упоминает использование функций только для того, чтобы передать массив стека функции и сохранить ее ... Не существует ли выход из этого, кроме итераций? –

+0

Вы могли бы, но, вероятно, не должны, сделать 'bk' в глобальный массив. Конечно, вы можете передать массив структур в функции - вы уже это делаете. Итерация здесь наиболее разумна. –

0
push: 
if(top==n-1) 
     return -1; 
main: 
top=push(bks,top,10); 

top сбрасывается, когда стек полный

Edit: И вторая проблема main вызывается снова, struct books bks[10] сбрасывается в следующий main, это рекурсия. Объявите bks глобальным или перейдите с помощью цикла while вместо рекурсии.

while (1) { 
    getChoices(); 
    if (exit) 
     /* exit from here */ 
    process(); 
} 
+0

Да, это проблема, но мой главный вопрос: если даже я добавляю только 1 информацию о книге, даже тогда, когда я показываю детали, которые он дает значениям мусора ... –

+0

plz см. в редакции. Благодарю. –

+0

Хорошо, спасибо за ответ ... Так как я не могу использовать рекурсию, так как вопросы явно упоминают использование функций, я сделал bks static и решил мои проблемы ... спасибо. –

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