在for循环中跳过scanf()

时间:2015-04-20 19:38:53

标签: c scanf

在Windows中我使用flushall()函数来刷新所有缓冲区,但这在Linux中不起作用,我的scanf()函数跳过而不扫描:

for(i=0;i<n;i++)
   {
    printf("\nEnter alphabet :");
    scanf("%c",&x);
    printf("\nEnter frequency :");
    scanf("%f",&probability);
  /* create a new tree and insert it in
     the priority linked list */
    p=(treenode*)malloc(sizeof(treenode));
    p->left=p->right=NULL;
    p->data=x;
    p->freq=(float)probability;
    head=insert(head,p);
  }

输出:

mayur@mayur-laptop:~$ ./a.out

Enter alphabet :a

Enter frequency :2

Enter alphabet :
Enter frequency :a

Enter alphabet :
Enter frequency :2

Enter alphabet :
Enter frequency :a

Enter alphabet :

2 个答案:

答案 0 :(得分:0)

更新 OP将第一个scanf中的“%d”更改为“%c”,我认为错误会在以后发生;但是坦率地说,我不觉得再投资了.--

原始答案:输入永远不会超出'a',因为您尝试使用转换规范%d读取它不满足的整数。 (为了读取一个字符,你要指定%c。)Scanf将有问题的字符放回输入中,并尝试读取下一个再次失败的数字,依此类推ad eternum。

值得检查scanf的返回值,此值始终为0,表示没有成功转换。

答案 1 :(得分:0)

你应该在scanf的开头添加一个空格,并在fflush(stdin)之前添加scanf只是为了清除标准输入缓冲区(默认情况下是键盘),如下所示:

for(i=0;i<n;i++){
    printf("\nEnter alphabet :");
    fflush(stdin);
    scanf(" %c",&x);
    printf("\nEnter frequency :");
    fflush(stdin);
    scanf(" %f",&probability);
  /* create a new tree and insert it in
     the priority linked list */
    p=(treenode*)malloc(sizeof(treenode));
    p->left=p->right=NULL;
    p->data=x;
    p->freq=(float)probability;
    head=insert(head,p);
  }

编辑:检查您是否有char xfloat probability