【问题标题】:Understanding fgets() function in C理解 C 中的 fgets() 函数
【发布时间】:2021-02-15 18:31:57
【问题描述】:

我正在研究 scanf() - 将光标移动到下一行,所以很好奇 fgets 是否也这样做,但我得到的输出对我来说没有意义。请帮助我理解它

代码 -

main()
{
char name[30] , name2[20];

scanf("%s" , name) ;
printf("%s" , name) ;
fgets(name2 , 30 , stdin) ;
printf("%s" , name2) ;

return 0 ;
}

输出 - enter image description here

在第一行我输入了premier,它在第二行给出了premier的输出,但它没有第二次要求我输入,请澄清fgets()是否也将光标移动到第二行

感谢您的帮助!!!

【问题讨论】:

  • “将光标移到下一行”,也许你的意思是"consumes all available consecutive whitespace characters from the input"scanf() 将为 "%s "(带空格)执行此操作,但不适用于 "%s"(无空格)。
  • scanf 读取到换行符。 fgets 然后读了它并认为没有其他东西可以读。
  • scanf() 在流中留下一个尾随换行符,稍后由fgets() 使用。在scanf() 之后打电话给getchar() 应该适合这个 案例。
  • 请注意scanf("%s", name); 并不比gets() 更安全,永远不要使用它。两个输入都使用fgets() 会更好。
  • 不要发文字图片

标签: c output


【解决方案1】:

第一个scanf 不消耗行尾,只是一个字符串;所以对fgets 的调用读取了一个空行。

切勿将scanffgets 混用,否则会有问题。 scanf 是格式化输入,而 fgets 只是原始输入。

【讨论】:

    【解决方案2】:

    scanf() :此函数将值扫描到下一个空格或新行。 fgets() :此函数获取值到指定的限制或换行符。(包括换行符)

    在您的代码中,scanf 的第一个字/行扫描不会在终端上打印,因为 printf 函数将其存储在缓冲区中。下一个输入由 fgets 命令获取,printf 函数也将其值存储在缓冲区中。程序结束后,整个缓冲区会打印在终端上,因此您的输出不是预期的。 printf 函数仅在您的程序关闭或新行出现时打印/刷新数据(清除缓冲区)。

    在您的程序中添加“\n”以便更好地理解

    #include <stdio.h>
    int main()
    {
       char name[30] , name2[20];
    
       scanf("%s" , name) ;
       printf("%s\n" , name) ;
       fgets(name2 , 30 , stdin) ;
       printf("%s" , name2) ;
    
       return 0 ;
    }
    

    输出:

    ./a.out
    Scaning fget started
    Scaning
     fget started
    
    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    相关资源
    最近更新 更多