【问题标题】:scanf() gets skipped in for loopscanf() 在 for 循环中被跳过
【发布时间】:2015-04-20 19:38:52
【问题描述】:

在 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 :

【问题讨论】:

标签: c scanf


【解决方案1】:

您应该在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

【讨论】:

  • 1) fflush(stdin) 在许多平台上没有很好的定义。最好避免。好奇:什么参考/人建议使用fflush(stdin)? 2) scanf(" %f",&amp;probability); 中的空格是不需要的,因为"%f" 已经占用了前导空格,但不会造成太大伤害
  • 我只是根据我以前必须做的程序来推荐。我同意你的意见,我不喜欢 fflush,但以防万一......
【解决方案2】:

更新: OP 将第一个 scanf 中的“%d”更改为“%c”,我认为这会让错误在以后发生;但坦率地说,我不想在这里投入更多时间。--

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

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

【讨论】:

  • 对不起,我写的代码很匆忙,我提到的输出是字符'x',你能纠正我的代码吗?
  • 相当不错。为什么不尽最大努力阅读相关文档、编写代码、测试和调试它呢?通常这可以解决问题。如果您仍然有问题,请提供一个最小的独立示例,以最大程度地关注正确的输入和文档来运行它,然后再次提问。而不是浪费我的时间。
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
相关资源
最近更新 更多