我正在使用 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
我正在编写一个非常简单的脚本来将字符串作为输入并使用一些自定义消息打印相同的内容。第一个用户输入 T(获取字符串的次数),然后通过 fgets.
获取输入。我用了this & this作为引用。
我得到一个非常奇怪的输出,即 fgets 添加了一些额外的新行,甚至循环对于 T=2 也不能正常工作,它只要求输入一次。
谁能解释一下代码片段有什么问题.提前致谢!
#include<stdio.h>
#include<string.h>
int main()
{
int T;
scanf("%d",&T);
while(T--){
char str[100]={""};
int i;
printf("Hello\n");
fgets(str,80,stdin);
i = strlen(str)-1;
if(str[i]=='\n')
str[i]='\0';
printf("World\n");
printf("%s\n",str);
}
return 0;
}
请查看 T=2 的图像引用,即使 T=2 也只使用一次字符串并且打印语句的顺序也不符合预期。
最佳答案
这是因为你的scanf()
调用
scanf("%d",&T);
不会消耗您输入的换行符 \n
。
当您输入T
时,您的输入是2Enter。
scanf()
消耗 2
,看到 \n
并停止消耗,留下 \n
输入缓冲区。
当 fgets()
被调用时,它会在缓冲区中看到 \n
并将其视为输入。
要解决这个问题,您有几个选择(按照我的主观偏好降序排列):
使用
fgets()
获取第一个输入,然后使用strtol()
解析它以获取T
。在
scanf()
之后添加一个额外的fgets()
。添加
getchar()
以消耗一个额外的字符。如果您确定在输入后恰好有一个\n
将出现,则此方法有效。例如,如果您键入 2SpaceEnter,它将不起作用。或者,您可以在scanf()
之后使用while(getchar() != '\n');
将所有内容消耗到一个新行,但这可能会导致如果空行是您以后的fgets()
调用的有效输入,则会出现问题。如果您的实现支持它,您可以使用
fpurge(stdin)
或__fpurge(stdin)
。
而且,非常重要的是,不要使用fflush(stdin)
除非您的实现明确定义了它的行为。否则它是未定义的行为。可以引用this question更多细节。另外请注意,如果您的输入可以通过管道传输到程序中,则 fpurge()
和 fflush()
方法可能无法正常工作。
关于c - fget 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30697465/