Fgets() 不断跳过第一个字符

Fgets() keeps skipping first character

这是模拟 unix 中 cat 命令的大型程序的一部分。现在正在尝试获取输入并将其发送到标准输出:

char in[1000];
int c = 0; 
while ((c = getchar()) != EOF)
 {
   fgets(in,1000,stdin);
   fputs(in, stdout);
 }

这会将输出发送到标准输出,但在每种情况下都会跳过第一个字母。例如,如果我输入单词 Computer

我回来了:

omputer

它不会跳过您使用 getchar() 使用它的任何内容。

成功完成后,fgets() return 是字符串 in。如果流位于文件末尾,则应设置流的文件末尾指示符,并且 fgets() 应 return 一个 NULL 指针。

改变这个

while ((c = getchar()) != EOF)

while (fgets(in, sizeof(in), stdin) != NULL)  

你的问题全在于吃。

c = getchar()

这一行,C 中的 I/O 操作消耗了您的缓冲区 。这意味着当您在 getchar() 之后说 0123456789 时,您的缓冲区中将剩下 123456789

你想要做的是使用相同的函数来控制输入并存储它,所以像摆脱 getchar() 这样的东西应该可以解决问题:

while (fgets(in,1000,stdin) != NULL)
 {
   fputs(in, stdout);
 }

给你!

有一个 ungetc 函数允许 return 字符到流。它不是标准的 C 函数,而是在类 Unix 系统和 Visual Studio CRT:

中实现的
while ((c = getchar()) != EOF)
{
    ungetc(c, stdin);
    fgets(in, 1000, stdin);
    fputs(in, stdout);
}

但正如其他回答者指出的那样,更简洁的方法是直接使用 fgets()

while (fgets(in, sizeof(in), stdin) != NULL)

第三个选项是将第一个字符直接保存为字符串:

while ((c = getchar()) != EOF)
{
    in[0] = c;
    fgets(in + 1, 999, stdin);
    fputs(in, stdout);
}

这也行得通:

char in[1000];
while ((in[0] = (char)getchar()) != EOF)
 {
   fgets(in+1,999,stdin);
   fputs(in, stdout);
 }