c - fget 是如何工作的?

标签 c fgets

我正在使用 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 也只使用一次字符串并且打印语句的顺序也不符合预期。 when T=2 and

最佳答案

这是因为你的scanf()调用

scanf("%d",&T);

不会消耗您输入的换行符 \n

当您输入T时,您的输入是2Enter

scanf() 消耗 2,看到 \n 并停止消耗,留下 \n输入缓冲区。

fgets() 被调用时,它会在缓冲区中看到 \n 并将其视为输入。

要解决这个问题,您有几个选择(按照我的主观偏好降序排列):

  1. 使用 fgets() 获取第一个输入,然后使用 strtol() 解析它以获取 T

  2. scanf() 之后添加一个额外的 fgets()

  3. 添加getchar() 以消耗一个额外的字符。如果您确定在输入后恰好有一个 \n 将出现,则此方法有效。例如,如果您键入 2SpaceEnter,它将不起作用。或者,您可以在 scanf() 之后使用 while(getchar() != '\n'); 将所有内容消耗到一个新行,但这可能会导致如果空行是您以后的 fgets() 调用的有效输入,则会出现问题。

  4. 如果您的实现支持它,您可以使用 fpurge(stdin)__fpurge(stdin)

而且,非常重要的是,不要使用fflush(stdin) 除非您的实现明确定义了它的行为。否则它是未定义的行为。可以引用this question更多细节。另外请注意,如果您的输入可以通过管道传输到程序中,则 fpurge()fflush() 方法可能无法正常工作。

关于c - fget 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30697465/

相关文章:

linux - fgets 不以换行符终止

c - 在c中查找指向链表中元素的指针

C - 使用 sscanf 读取多个整数和 float

c - 如何严格使用 fgets 函数以大写/小写字母打印字符串?

c - 程序添加数字不显示任何输出

c - stdin 在第一行之后到达 EOF

c - 从 fgets() 输入中删除尾随换行符

c - Eclipse 项目不能包含 tchar.h

c - 如何在c中找到字符串的位模式

c - 如何以编程方式在正在运行的应用程序中查找符号