2015-04-20 71 views
0

在Windows中我使用flushall()函数来清空所有缓冲区,但在Linux中,这不工作,我的scanf()函数,而扫描跳过: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); 
    } 

输出:

[email protected]:~$ ./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 : 
+0

可能重复的[Scanf在C中跳过while each循环](http://stackoverflow.com/questions/1669821/scanf-skips-every-other-while-loop-in-c) – axiac

+0

In它的当前形式(使用'scanf(“%c”)'这个问题是ma的重复关于'scanf()'的这种行为的其他问题。 – axiac

回答

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

+0

1)'fflush(stdin)'在很多平台上没有很好的定义。更好避免。好奇:参考/人使用'fflush(stdin)'建议? 2)scanf(“%f”,&probability)中的空格;''%f''不需要占用前导空格,尽管不会造成太大伤害 – chux

+0

我只是建议根据以前的程序去做。我分享你的意见,我不喜欢fflush,但以防万一...... – user24100

0

更新:的OP改变了 “%d”,在第一scanf的为 “%C”,它可以让该错误,我认为,发生以后;但我不觉得投入更多的时间在这里.--

原始回答:输入永远不会超出'a'处理,因为您尝试使用转换规范%d读取它,以获得整数它不满足。 (为了读取一个字符,你可以指定%c。)Scanf将违规字符放回到输入中,并尝试读取下一个再次失败的数字,等等。

这里值得检查一下scanf的返回值,它总是为0,表示没有成功转换。

+0

对不起,我急着写了代码,我提到的输出是字符'x',你会纠正我的代码吗? –

+0

相当一个chuzpe。为什么不尽全力阅读相关文档,编写代码,测试和调试?通常可以解决问题。如果您仍然有疑问,请提供一个最小的独立示例,最大限度地注意正确输入和文档,然后再询问。而不是浪费我的时间。 –