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\n", 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()的时候,要注意情况。