按Enter键时scanf不返回

Ver*_*tas 3 c buffer input scanf

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

char buffer[101];
scanf("%100[^\n]", buffer);
Run Code Online (Sandbox Code Playgroud)

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

char buffer[101];
scanf("%100[^\n]\n", buffer);
Run Code Online (Sandbox Code Playgroud)

按Enter键后不返回.

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

aut*_*tic 5

是的,您错过了一个记录良好的重要细节.根据scanf手册 ...

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

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

如果你想丢弃'\n'scanset指令后面的那个,你可以%*c像这样使用:int x = scanf("%100[^\n]%*c", buffer);...

PS别忘了检查价值x.使用scanset指令时尤其重要,因为buffer在这种情况下,空行将导致未初始化.