糖逗 发表于 2019-10-21 10:27:29

scanf和fgets之间的区别【转载自CSDN】

转自:https://blog.csdn.net/zengraoli/article/details/19540153

写得很好,以下是原博的内容
1、测试使用scanf的一个例子:


#include "stdio.h"
#include "string.h"


int main()
{
        char name;
        scanf("%s", name);

        puts(name);       


        return 0;
}

编译、调用如下:



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





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

#include "stdio.h"
#include "string.h"


int main()
{
        char name;
        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
页: [1]
查看完整版本: scanf和fgets之间的区别【转载自CSDN】