鱼C论坛

 找回密码
 立即注册
查看: 1845|回复: 0

[技术交流] C语言-scanf和fgets的区别【转载】

[复制链接]
发表于 2019-11-24 10:01:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zengraoli/article/details/19540153
1、测试使用scanf的一个例子:


  1. #include "stdio.h"
  2. #include "string.h"


  3. int main()
  4. {
  5.         char name[10];
  6.         scanf("%s", name);

  7.         puts(name);       


  8.         return 0;
  9. }
复制代码

编译、调用如下:



可以看到第二次,由于输入的字符串长度,导致Abort





2、同样的一个fgets的例子:

  1. #include "stdio.h"
  2. #include "string.h"


  3. int main()
  4. {
  5.         char name[10];
  6.         fgets(name, 10, stdin);

  7.         puts(name);       


  8.         return 0;
  9. }
复制代码

编译、调用如下:


并没有像scanf那样出现Abort的情况,而是对字符串进行了截断




3、对比scanf和fgets:

a) scanf不限制用户的输入,导致会出现上面测试例子的Abort

fgets限制用户的输入,超过之后进行截断字符串的操作,避免了Abort,但是要设置一个缓冲区长度值

 

b) scanf可以使用诸如scanf("%d/%d", &x, &y),这样的形式,让用户只需要输入1/3便可以分别得到x、y的值:

  1. #include "stdio.h"


  2. int main()
  3. {
  4.         int x;
  5.         int y;
  6.         scanf("%d/%d", &x, &y);
  7.         printf("x value : %d, y value : %d\n", x, y);

  8.         return 0;
  9. }
复制代码



但是fgets,无论如何,每次都只能读入一个变量,而且只能是字符串(毕竟说是str嘛!),像下面这样的形式,编译是通不过的:

  1. #include "stdio.h"


  2. int main()
  3. {
  4.         int x;
  5.         fgets(x, sizeof(x), stdin);
  6.         printf("x value : %d", x);

  7.         return 0;
  8. }
复制代码





c)字符串中的空格

scanf用%s接收字符串的时候,遇到空格就会停止。如果想输入多个单词,需要多次调用scanf()

fgets()直接接收字符串中的空格




4、总结

由于3提到的一些区别,所以在使用scanf()和fgets()的时候,要注意情况。
————————————————
版权声明:本文为CSDN博主「孤独的糖三角」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zengraoli/article/details/19540153
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-3 16:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表