2013-09-08 2 views
0

Я пишу программу для реализации связанного списка в C.Here - это моя программа.getchar() не принимает ввод

/*Implementing a singly linked list in c*/ 
#include<stdio.h> 
#include<stdlib.h> 
#include<alloca.h> 

    struct node{ 

    int data; 
    struct node* link; 
}*start=NULL; 


void main(){ 

    char choice; 
    int data; 

    do{ 

     printf("Enter data\n"); 
     scanf("%d",&data); 

     struct node* temp; 
     temp=(struct node*)malloc(sizeof(struct node)); 
     temp->data=data; 
     temp->link=NULL; 

     if(start==NULL) 
      start=temp; 
     else 
     { 
      struct node* traversing_pointer; 
      traversing_pointer=start; 
      while(traversing_pointer!=NULL) 
       traversing_pointer=traversing_pointer->link; 

      traversing_pointer->link=temp; 

     } 
     printf("Do you want to enter more"); 
choice=getchar();   

    } 
    while(choice=='y'|| choice=='Y');} 

Я в принципе хочу, по крайней мере один узел в связанном списке должен быть создан, поэтому я использую делают, в то время как цикл. Но после первого ввода данных программа завершается без принятия ввода для переменной choice. Вот мой вывод. Что может быть

Enter data 
45 
Do you want to enter more 
RUN FINISHED; exit value 10; real time: 2s; user: 0ms; system: 0ms 

Какая возможная ошибка?

+2

Нам нужен новый 'тег' в stackoverflow, посвященный этой теме' getchar() после scanf() печальной ситуации'. – pablo1977

+0

Значение '10' для' \ n' (символ новой строки от нажатия «Enter»). 'scanf()' не потреблял его, поэтому это следующий доступный символ в буфере, и 'getchar()' выбирает его. – newfurniturey

ответ

2

Употреблять символ новой позиции во входном потоке, сделайте следующее:

scanf("%d",&data); 
getchar(); //To consume a newline 

или использовать цикл, чтобы прочитать все переводы строк.

scanf("%d",&data); 
int c=0; 
while ((c = getchar()) != '\n' && c != EOF) ; // Read & ignore all newlines 

Другая проблема, которую я вижу, заключается в том, что вы неправильно связываете узлы. Вы хотите связать новый узел как последний. Таким образом, вам нужно пройти до последнего узла (не до достижения NULL). Измените условие цикла на:

while(traversing_pointer->link!=NULL) 
    traversing_pointer=traversing_pointer->link; 

traversing_pointer->link=temp; 
+0

Спасибо! Это сработало. – fts

1

Это потому, что ваш getchar читает конец введенной строки, нажимая Enter после ввода 45.

+0

как исправить эту ошибку? – fts

+0

Вы читаете его перед чтением фактических данных. –

+0

как это сделать? – fts

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