鱼C论坛

 找回密码
 立即注册
查看: 1406|回复: 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的一个例子:

#include "stdio.h"
#include "string.h"
 
 
int main()
{
        char name[10];
        scanf("%s", name);
 
        puts(name);        
 
 
        return 0;
}
编译、调用如下:



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





2、同样的一个fgets的例子:
#include "stdio.h"
#include "string.h"
 
 
int main()
{
        char name[10];
        fgets(name, 10, stdin);
 
        puts(name);        
 
 
        return 0;
}
编译、调用如下:


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




3、对比scanf和fgets:

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

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

 

b) scanf可以使用诸如scanf("%d/%d", &x, &y),这样的形式,让用户只需要输入1/3便可以分别得到x、y的值:
#include "stdio.h"
 
 
int main()
{
        int x;
        int y;
        scanf("%d/%d", &x, &y);
        printf("x value : %d, y value : %d\n", x, y);
 
        return 0;
}


但是fgets,无论如何,每次都只能读入一个变量,而且只能是字符串(毕竟说是str嘛!),像下面这样的形式,编译是通不过的:
#include "stdio.h"
 
 
int main()
{
        int x;
        fgets(x, sizeof(x), stdin);
        printf("x value : %d", x);
 
        return 0;
}




c)字符串中的空格

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

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




4、总结

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-4 23:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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