2017-06-06 1 views
-1

Comment afficher la pile lorsque j'insère x dans des programmes.Comment afficher la pile C

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

struct Node 
{ 
    int Data; 
    struct Node* next; 
} * top; 

void popStack() 
{ 
    struct Node *temp, *var = top; 
    if (var == top) 
    { 
     top = top->next; 
     free(var); 
    } 
    else 
     printf("\nStack Empty"); 
} 

void push(int value) 
{ 
    struct Node* temp; 
    temp = (struct Node*)malloc(sizeof(struct Node)); 
    temp->Data = value; 
    if (top == NULL) 
    { 
     top = temp; 
     top->next = NULL; 
    } 
    else 
    { 
     temp->next = top; 
     top = temp; 
    } 
} 

void display() 
{ 
    struct Node* var = top; 
    if (var != NULL) 
    { 
     printf("\nElements are as:\n"); 
     while (var != NULL) 
     { 
      printf("\t%d\n", var->Data); 
      var = var->next; 
     } 
     printf("\n"); 
    } 
    else 
     printf("\nStack is Empty"); 
} 

int main(int argc, char* argv[]) 
{ 
    printf(" Wellcome to Basic Stacking. \n"); 
    top = NULL; 
    while (1) 

    { 

lors de l'insertion « x » Je veux programme pour afficher la pile et la sortie, mais il ne fonctionne pas après insérer x dans ce programme, il sera boucle infinie et ne pas afficher la pile et ne quittez pas que devrais-je faire????.

 char x ; 

     int value; 
     if (value != x) 
     { 

      printf("please enter Your Name:"); 
      scanf("%d", &value); 
      push(value); 
      fflush(stdin); 
      display(); 
     } 
     else 
     { 
      // popStack(); 
      display(); 
      break; 
     } 
    } 
    getch(); 
} 
+5

Non lié à votre problème, mais l'appel 'fflush' avec un flux en entrée seulement (comme' stdin') est explicitement mentionné dans la spécification C comme * undefined behavior *. Certaines bibliothèques l'implémentent comme une extension, mais vous devriez vraiment vous abstenir de le faire. –

+2

Plus lié à votre problème pourrait être le fait que vous utilisez 'value' avant qu'il ne soit initialisé, et ont donc une valeur * indéterminée *. Prenez également le temps de lire sur [comment déboguer de petits programmes] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

Répondre

0

J'ai trouvé votre problème! C'était un peu un mal de tête puisque le programme allait toujours pour une boucle infinie! Mais le problème est que vous lisez des caractères avec scanf("%d",&value). Ce scanf ne supprime pas l'entrée du tampon, donc tous les autres scanf que vous faites après auront la même entrée ('x'), que votre scanf ne peut pas lire.

Pour résoudre ce changement ces lignes:

printf("please enter Your Name:"); scanf("%d", &value);

à

printf("please enter Your Name:"); if(scanf("%d", &value)==0)value=x;

Donc, si scanf ne réussit pas, alors vous assumez l'utilisateur veut quitter.

Ceci est également une question en double, se référer à this question, pour plus de détails.

1

Un mec programmeur déjà repéré, mais je veux être un peu plus explicite:

char x; 
int value; 
if (value != x) 

x et la valeur sont non initialisée, ils pourraient tenir une valeur. Si vous les comparez, il est très peu probable qu'ils correspondent, mais ils pourraient par accident, même la première fois que vous entrez dans la boucle (menant à la sortie immédiate). Il est très peu probable, aussi, cette variable x détient la valeur de 'x' – à la fin, il est un comportement non défini de toute façon à lire des variables non initialisées ...

problème suivant est: Vous utilisez simplement scanf("%d"). Cela échouera en essayant de lire l'entrée, si vous tapez un caractère 'x', car celui-ci ne peut pas être numérisé en tant que nombre. Il faudrait donc d'abord lire une chaîne puis l'analyser. Les deux erreurs fixées ensemble, votre code pourrait ressembler à ceci:

char buffer[128]; 
while(1) 
{ 
    if(!fgets(buffer, sizeof(buffer), stdin)) 
     break; // some error occured 
    if(*buffer == 'x') // you can compare directly, you don't need a char x = 'x'; ... 
     break; 
    int value; 
    char c; 
    if(sscanf(buffer, "%d %c", &value, &c) == 1) 
    { 
     // ... 
    } 
    else 
    { 
     puts("invalid input"); 
     fflush(stdout); 
    } 
} 

balayage pour un caractère supplémentaire après le nombre (important: le caractère d'espace est nécessaire avant de sauter l'espace blanc, à savoir le retour à la ligne de terminaison a obtenu de fgets) Avec la vérification de la valeur de retour de sscanf, une entrée invalide est détectée, comme 'abc' ou '1xyz'.

De plus, un coup d'oeil à votre fonction popStack:

struct Node* var = top; 
if (var == top) 

Cela toujours être vrai, même le sommet est NULL: alors var est NULL, aussi, et NULL est égal à lui-même, cours...

Vous devriez plutôt le faire de cette façon:

if (top) 
{ 
    struct Node* var = top; 
    top = top->next; 
    free(var); 
} 

bonnes pratiques vérifie toujours la valeur de retour de malloc. Bien qu'il ne devrait jamais échouer dans un si petit programme comme le vôtre, vous ne l'oublierez pas plus tard lors de l'écriture de programmes plus importants si vous vous y habituez dès le début ...

Avec une certaine simplification du code (admis, cosmétiques seulement, mais si n'est pas nécessaire ...):

struct Node* temp = (struct Node*)malloc(sizeof(struct Node)); 
if(temp) 
{ 
    temp->Data = value; 
    temp->next = top; 
    top = temp; 
} 
else 
{ 
    // appropriate error handling 
} 

une dernière recommandation: Vos deux fonctions forment une paire fonctionnelle, donc préfèrent réfléchir cela dans leur nom aussi: soit « push » et « pop "ou" pushStack "et" popStack ".

0

Votre comparaison de value par rapport à x appelle toujours un comportement non défini. La portée de value est le corps de la boucle. Effectivement vous obtenez un "nouveau" value chaque fois que vous faites le tour de la boucle. Votre scanf recherche un certain nombre. Si vous pensez que la boucle se termine lorsque vous appuyez sur la touche x de votre clavier, cela ne fonctionnera pas. Le scanf va effectivement échouer car x n'est pas une séquence de correspondance valide pour %d. D'autre part, si vous tapez 120 qui est le code ASCII pour x vous pourriez avoir de la chance et voir la boucle se terminer parce que le comportement indéfini pourrait inclure la réutilisation du même emplacement pour value à chaque itération de la boucle. Pour corriger cela, définissez la valeur lue avant de faire la comparaison pour voir si elle est x. En outre, vous devrez le lire en utilisant, par exemple fgets(), puis le vérifier pour voir s'il x et puis, si ce n'est pas peut-être utiliser strtol() ou sscanf() pour le convertir en un nombre.