zoukankan      html  css  js  c++  java
  • fgets和scanf的区别

    fgets和scanf的区别

    1、测试使用scanf的一个例子:
    1. #include "stdio.h"  
    2. #include "string.h"  
    3.   
    4.   
    5. int main()  
    6. {  
    7.     char name[10];  
    8.     scanf("%s", name);  
    9.   
    10.     puts(name);   
    11.   
    12.   
    13.     return 0;  
    14. }  

    编译、调用如下:

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

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

    1. #include "stdio.h"  
    2. #include "string.h"  
    3.   
    4.   
    5. int main()  
    6. {  
    7.     char name[10];  
    8.     fgets(name, 10, stdin);  
    9.   
    10.     puts(name);   
    11.   
    12.   
    13.     return 0;  
    14. }  

    编译、调用如下:

    并没有像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.   
    3.   
    4. int main()  
    5. {  
    6.     int x;  
    7.     int y;  
    8.     scanf("%d/%d", &x, &y);  
    9.     printf("x value : %d, y value : %d ", x, y);  
    10.   
    11.     return 0;  
    12. }  

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

    1. #include "stdio.h"  
    2.   
    3.   
    4. int main()  
    5. {  
    6.     int x;  
    7.     fgets(x, sizeof(x), stdin);  
    8.     printf("x value : %d", x);  
    9.   
    10.     return 0;  
    11. }  

    c)字符串中的空格

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

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

    4、总结

    由于3提到的一些区别,所以在使用scanf()和fgets()的时候,要注意情况。

  • 相关阅读:
    图像和流媒体 -- 帧率、分辨率、码流的概念和关系(转)
    Linux设备驱动(转)
    STM32开发 -- 4G模块开发详解(转)
    Linux下EC20实现ppp拨号(转)
    使用机智云APP控制战舰V3 (转)
    USB Host读取U盘成功
    FreeModbus在STM32上移植(转)
    处理分页操作
    HBase参数配置及说明(转)
    学习JNDI
  • 原文地址:https://www.cnblogs.com/lcx4/p/4714280.html
Copyright © 2011-2022 走看看