【问题标题】:Function call skips the function's statement函数调用跳过函数的语句
【发布时间】:2014-04-11 20:50:07
【问题描述】:

每当我调用此函数时,它都会跳过其中的 fgets 语句。

void getString(char *str){ /* Read a string from the keyboard */
    fprintf(stdout,"Please enter a string: ");
    fgets(str,MAX_STRING_LEN,stdin);
}

这是函数调用

if(strcmp(cmd,"new")==0){ /* new string command */
        getString(current);
}

【问题讨论】:

  • 你确定它已经被调用了吗?什么是“电流”?你认为它没有被调用是因为调试器(内联?)还是因为它没有输出任何东西?
  • @hacks 我相信你的意思是输出?冲洗stdin 是UB。
  • @FilipeGonçalves;哎呀!删除我的评论:)
  • current其实是一个字符串数组;
  • 对不起,但问题是现在,我们所能做的就是推测。请考虑提供所有相关(甚至可能相关)的内容,以便我们给出答案。在这里,另一种猜测:您是否可能拥有重定向的标准输入stdin?要么通过freopen 调用,要么通过在 Linux 终端上做一些我不知道的事情......

标签: c string function-call


【解决方案1】:

您可能在程序的其他地方混合使用了 scanf() 和 fgets()。对所有输入使用 fgets(),始终为字符串,而不是在必要时使用 sscanf() 将字符串转换为其他数据类型。

请参阅 comp.lang.c 常见问题解答,其中更详细地描述了这一点:

http://c-faq.com/stdio/scanfinterlace.html

【讨论】:

    【解决方案2】:

    fprintf(3) 的输出被缓冲。在尝试读取输入之前,您需要刷新该缓冲区以强制退出提示。 stderr 通道通常是无缓冲的,因此您可以写入该通道而无需手动刷新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多