2016-06-18 3 views
0

Я делал программу для ввода чисел в стек, а цикл do-while был автоматически завершен, не дожидаясь ответа. Следовательно, были сделаны и отображены только одна информация.Программа автоматически завершается, не дожидаясь ответа. Зачем?

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

struct node 
{ 
    int data; 
    struct node *next; 
}; 
typedef struct node NODE; 

NODE *top = NULL; 

void push(int x) 
{ 
    NODE *p; 

    p = (NODE*)malloc(sizeof(NODE)); 
    p->data = x; 
    p->next = top; 
    top = p; 
} 

void display(void) 
{ 
    NODE *t; 

    t = top; 
    if(t == NULL) 
    { 
     printf("\nstack is empty"); 
    } 
    else 
    { 
     while(t != NULL) 
     { 
      printf("%d ", t->data); 
      t = t->next; 
     } 
    } 
} 

int main(void) 
{ 
    int m; 
    char ans; 

    do 
    { 
     printf("\nEnter the no. to insert in stack: \n"); 
     scanf("%d", &m); 
     push(m); 

     printf("\nDo you want to enter more data???\n"); 
     scanf("%c", &ans); 
    } while(ans == 'y' || ans == 'Y'); // here after entering a value for variable 'm', the program terminates displaying the stack with one element. 

    display(); 
    return 0; 
} 
+3

'зсапЕ ("% С", &ans);' -> 'зсапЕ ("% С", &ans);' Обратите внимание на дополнительное пространство, которое потребляет 'newline', который был оставлен во входном буфере после того, как' зсапЕ («% d», &m); «» –

+0

Должен ли я использовать этот метод всякий раз, когда я использую один «скаффикс» после другого? – Sudeep

+0

Пожалуйста, см. мой ответ. –

ответ

4

Пожалуйста, измените

scanf("%c", &ans); 

к

scanf(" %c", &ans); 

Обратите внимание дополнительное пространство, которое потребляет newline, который был оставлен во входном буфере после предыдущего ввода.

Обратите внимание, что некоторые спецификаторы формата, такие как %d и %s, автоматически потребляют любые ведущие пробелы и оставляют в буфере следующий символ, который не соответствует формату. В случае вашего %d, который был newline.

Формат %c, однако, собирает следующий символ из входного буфера независимо от того, что он есть, и ведущее пространство предотвращает это.

1

Кроме того, добавление пространства в строке формата потреблять новую строка уже упоминалась выше, это также хорошая практика, чтобы проверить scanf возвращаемого значение, так как это может быть не в состоянии ввод целого значения и до сих пор push старого значения m на стек.

int main(void) 
{ 
    int m; 
    char ans; 
    int ret; 
    do 
    { 
     printf("\nEnter the no. to insert in stack: \n"); 
     ret = scanf("%d", &m); 
     if (ret != 1) { 
      printf("invalid input\n"); 
      continue; 
     } 
     push(m); 

     printf("\nDo you want to enter more data???\n"); 
     ret = scanf(" %c", &ans); 
     if (ret != 1) { 
      printf("invalid input\n"); 
      continue; 
     } 
    } while(ans == 'y' || ans == 'Y'); 
} 
Смежные вопросы