【问题标题】:Newline stays in buffer after fgets()?fgets()之后换行符留在缓冲区中?
【发布时间】:2011-05-20 17:02:30
【问题描述】:

这是导致我出现问题的代码的 sn-p:

#define MAX_NAME_LEN 64

char choice;
char name[MAX_NAME_LEN];
printf("Name: ");
fgets(name, MAX_NAME_LEN, stdin);
choice = getchar();

在我输入名称并按 Enter 后,getchar() 也会捕获换行符,而不是等待下一个字符。如何修复我的代码(如果可能的话,不要像另一个 getchar() 这样的hacky),以便 getchar() 在输入名称后按预期等待字符?

【问题讨论】:

  • 您不应该在MAX_NAME_LEN 中添加一个 - fgets() 只会读取 n - 1 字符,剩下一个用于终止 NUL。
  • 啊,没错。谢谢指正。

标签: c newline fgets getchar


【解决方案1】:

我无法在 Mac OS X 系统上使用 GCC 复制您的问题。您是否正在使用 Windows 系统,按 ENTER 可能会同时生成 CRLF

无论如何,请注意getchar() 通常不会在单次按键后立即返回,因为在大多数系统上stdin 默认情况下是行缓冲,这意味着终端子系统不会在按下ENTER 之前,将任何字符传递给用户进程。

getchar() 不能替代旧的 DOS <conio.h> 功能,如 getch()

解决这个问题取决于您使用的操作系统。

【讨论】:

  • fgets 总是reads in a newline 如果它看到一个。 If a newline is read, it is stored into the buffer.
  • 是的,我没有说别的。不清楚的是,为什么显然只按一次回车会导致他的fgets()getchar() 调用都完成。它对我有用。
猜你喜欢
  • 2021-05-12
相关资源
最近更新 更多