while()循环不按预期工作。可能是什么原因?

时间:2014-06-20 19:53:36

标签: c function linked-list singly-linked-list control-flow

我已经开始在C中编写链接列表。我的代码如下:

#include<stdio.h>
#include<malloc.h>
struct node
{
    int data;
    struct node *next;       

};

struct node * create(struct node *);
display(struct node *);

int main()
{  
    struct node *head=NULL;

    head = create(head);
    display(head);

    getch();
    return 0;

}

struct node * create(struct node *Head)
{
   struct node *temp;
   char ch='y';
   int i=1;
   while(ch=='y')
   {    
        temp=malloc(sizeof(struct node));
        temp->data=i*10;
        temp->next=Head;
        Head=temp;

        printf("\nAdded node : %d",Head->data);

        printf("\nContinue to add more nodes ?   :  ");
        scanf("%c",&ch);      
   }


   return Head;           

}


display(struct node *Head)
{
   while(Head!=NULL)
   { printf("%d\t%d\n",Head->data,Head->next);
         Head=Head->next;
   }

}

我面临的问题是进入功能后#34;创建&#34;并且只创建一个节点,我的程序跳回到main,然后跳转到&#34;显示&#34;功能,然后跳回功能&#34;创建&#34;在它询问我是否要继续的行。此时,当我输入&#34; y&#34;时,程序就退出了! 为什么这种行为? 有人请解释我控制流程如何为什么我的程序会变得混乱!!!

1 个答案:

答案 0 :(得分:5)

原因:

这是因为当您键入'y'然后按Enter键时,换行符'\n'会被缓冲,并会在scanf()的下一次迭代中读取。这将导致while(ch=='y')评估为false(从现在开始ch == '\n'),从而中断循环。

通常scanf()会在达到预期值之前跳过空格和换行符。但是,当您使用字符格式%c时,这不会发生,因为换行符和空格也是有效字符。


如何修复:

您可以使用scanf(" %c",&ch);进行修复。 %c之前的空格将在实际读取值之前跳过缓冲区中找到的任何前导退格或换行符。