2014-06-12 1 views
-1
printf("Enter the value\n"); 
scanf("%d ",&data); 

Mais scanf est en cours d'exécution avant printf. Quelle peut être la raison?printf scanf Exécution L'ordre est en cours d'échange

Ceci est mon programme tout

#include<stdio.h> 
#include<stdlib.h> 
struct Queue{ 
    int front,rear; 
    int capacity; 
    int *array; 
}; 

void enqueue(struct Queue *q){ 

    int data; 
    if(q->front == (q->rear+1)%q->capacity){ 
     printf("Queue is full\n"); 
     return; 
    }else{ 
     printf("Enter the value\n"); 
     scanf("%d ",&data); 
     q->rear = (q->rear+1) % q->capacity; 
     q->array[q->rear] =data; 

     if(q->front == -1) 
      q->front = q->rear; 
    } 

} 
void dequeue(struct Queue *q){ 

    if(q->front == -1){ 
     printf("Queue is Empty\n"); 
     return; 
    }else{ 
     printf("value dequeued %d \n",q->array[q->front]); 
     if(q->front == q->rear) 
      q->front = q->rear = -1; 
     else 
      q->front = (q->front+1)% q->capacity; 
    } 
} 
void printQueue(struct Queue *q){ 

    if(q->front == -1){ 
     printf("Queue is Empty\n"); 
     return; 
    }else{ 
     int f = q->front, r =q->rear; 

     while((f% (q->capacity)) != r) 
     { 
      printf ("\t %d", q->array[f]); 
      f++; 
     } 
    printf("\t %d",q->array[q->rear]); 
    printf("\n"); 
    } 
} 


main(){ 

    struct Queue *q = malloc(sizeof(struct Queue)); 
    if(!q){ 
     printf("Memory Error\n"); 
     exit; 
    } 
    q->capacity = 3; 
    q->front= q->rear = -1; 
    q->array = malloc(q->capacity * sizeof(int)); 
    if(!q->array){ 
     printf("Memory Error\n"); 
     exit; 
    } 

    int option; 
    char ch ='a'; 
    while(1) { 
     printf("Enter the choice 1.Enqueue or 2.Dequeue 3.print\n"); 
     fflush(stdout); 
     scanf("%d",&option); 
     switch(option){ 
     case 1: 
      enqueue(q);     
      break; 
     case 2: 
      dequeue(q); 
      break; 
     case 3: 
      printQueue(q); 
      break; 
     default: 
      printf("Wrong choice\n"); 
     } 


    printf("Do you want to continue? press y to continue\n"); 
    scanf("%s", &ch); 
    if(ch != 'y')break; 
    } 
} 

Quand j'ENQUEUE un élément, il attend l'entrée et après que printf est exécuté i. Voulez-vous continuer? Idéalement, quand je rentre dans l'élément pour mettre en file d'attente et appuyer sur la touche Entrée, il faut me demander si vous voulez continuer et attendre l'entrée, c'est-à-dire 'y'. Mais dès que j'entre dans l'élément pour enqueue il attend l'entrée 'y' et après avoir entré 'y', 'vous voulez continuer' est exécuté

+8

Non, ce n'est pas [] (http://www.google.com) –

+0

J'utilise. Le compilateur gcc par défaut d'ubuntu – pst

+0

Pourquoi vous fait croire qu'il est en cours de réorganisation? –

Répondre

0

Retravaillé le code de question. Le plus gros problème était l'utilisation de scanf(), qui laisse des valeurs non lues (comme les retours de chariot) derrière dans stdin. Les caractères non lus interfèrent avec la prochaine utilisation de scanf(). Changement de la scanf() pour gober les caractères superflus de stdin en ajoutant %*c aux chaînes de format:

#include<stdio.h> 
#include<stdlib.h> 
struct Queue{ 
    int front,rear; 
    int capacity; 
    int *array; 
}; 

void enqueue(struct Queue *q){ 

    int data; 
    if(q->front == (q->rear+1)%q->capacity){ 
     printf("Queue is full\n"); 
     return; 
    }else{ 
     printf("Enter the value\n"); 
     scanf(" %d%*c",&data); 
     q->rear = (q->rear+1) % q->capacity; 
     q->array[q->rear] =data; 

     if(q->front == -1) 
      q->front = q->rear; 
    } 

} 
void dequeue(struct Queue *q){ 

    if(q->front == -1){ 
     printf("Queue is Empty\n"); 
     return; 
    }else{ 
     printf("value dequeued %d \n",q->array[q->front]); 
     if(q->front == q->rear) 
      q->front = q->rear = -1; 
     else 
      q->front = (q->front+1)% q->capacity; 
    } 
} 
void printQueue(struct Queue *q){ 

    if(q->front == -1){ 
     printf("Queue is Empty\n"); 
     return; 
    }else{ 
     int f = q->front, r =q->rear; 

     while((f% (q->capacity)) != r) 
     { 
      printf ("\t %d", q->array[f]); 
      f++; 
     } 
    printf("\t %d",q->array[q->rear]); 
    printf("\n"); 
    } 
} 


int main() 
    { 
    int option; 
    char ch ='a'; 

    struct Queue *q = malloc(sizeof(struct Queue)); 
    if(!q) 
     { 
     printf("Memory Error\n"); 
     goto CLEANUP; 
     } 

    q->capacity = 3; 
    q->front= q->rear = -1; 
    q->array = malloc(q->capacity * sizeof(int)); 
    if(!q->array) 
     { 
     printf("Memory Error\n"); 
     goto CLEANUP; 
     } 

    while(1) 
     { 
     printf("Enter the choice 1.Enqueue or 2.Dequeue 3.print\n"); 
     scanf(" %d%*c",&option); 
     switch(option) 
     { 
     case 1: 
      enqueue(q); 
      break; 

     case 2: 
      dequeue(q); 
      break; 

     case 3: 
      printQueue(q); 
      break; 

     default: 
      printf("Wrong choice\n"); 
      break; 
     } 


    printf("Do you want to continue? press y to continue\n"); 
    scanf(" %c%*c", &ch); 
    if(ch != 'y') 
     break; 
    } 

CLEANUP: 

    return(0); 
    } 
+0

Merci beaucoup .actually le code a bien fonctionné quand j'ai enlevé l'espace après% d – pst

+0

J'ai changé scanf ("% d", & data) à ("% d", & data) – pst