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);
}
这是模拟 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);
}