按Enter键时scanf不返回

时间:2015-04-05 23:00:08

标签: c input buffer scanf

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

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

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

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

不返回。

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

1 个答案:

答案 0 :(得分:5)

是的,您错过了一个记录良好的重要细节。根据{{​​3}} ...

  

由一个或多个空格字符组成的指令应通过读取输入执行,直到不能再读取有效输入,或者直到第一个不是空白字符的字节仍未读取。

这意味着当你按回车键时scanf确实不会返回;它会继续等待你再次按下回车(或空格或标签)......再次......直到它看到不是空白的东西。

如果您要放弃扫描集指令后面的'\n',可以使用%*c,如下所示:int x = scanf("%100[^\n]%*c", buffer); ...

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