getchar()不接受输入

时间:2013-09-08 20:42:06

标签: c input

我正在编写一个程序来实现C.中的链表。这是我的程序。

/*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');}

我基本上希望创建链表中的至少一个节点,这就是我使用do,while循环的原因。但是在第一次数据输入之后,程序终止而不接受choice变量的输入。这是我的输出。什么可以是

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

可能出现的错误是什么?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

这是因为getchar45输入后按Enter键,您的{{1}}会读取您输入的行尾。