【问题标题】:scanf doesn't return when pressing enter按回车时scanf不返回
【发布时间】:2015-04-05 23:00:07
【问题描述】:

我花了过去一个小时试图找出原因

char buffer[101];
scanf("%100[^\n]", buffer);

按预期工作,读取字符串直到遇到换行符,而

char buffer[101];
scanf("%100[^\n]\n", buffer);

按 Enter 后不返回。

使用 CtrlD 显式刷新输入缓冲区(在 linux 中) 按下 Enter 后立即似乎可以解决问题, 强制 scanf 返回。我在这里遗漏了什么吗?

【问题讨论】:

    标签: c input buffer scanf


    【解决方案1】:

    是的,您错过了一个有据可查的重要细节。根据the scanf manual...

    由一个或多个空白字符组成的指令应通过读取输入来执行,直到无法读取更多有效输入,或者直到第一个不是空白字符的字节仍处于未读取状态。

    这意味着scanf 在您按下回车时确实不会返回;它会继续等待查看您是否再次按回车键(或空格或制表符)...并再次...直到它看到不是空白的内容。

    如果您想丢弃 scanset 指令后留下的'\n',您可以像这样使用%*cint x = scanf("%100[^\n]%*c", buffer);...

    附:不要忘记检查x 的值。使用 scanset 指令时这一点尤为重要,因为在这种情况下,空行将导致未初始化的 buffer

    【讨论】:

    • 不错的收获。我不知道非空格空白字符的这种行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2011-07-30
    • 2011-04-01
    • 2016-12-19
    • 1970-01-01
    • 2016-07-10
    • 2020-02-23
    相关资源
    最近更新 更多