C/C++——字符串输入gets与scanf的比较


版权声明:本文为博主原创文章,转载请附上博文链接。

 

在C语言中当从标准输入设备输入字符串时,可以使用gets()和scanf()函数。

gets()和scanf()函数都是C语言标准库中的函数,但是适用情况是不同的。

 


1. 功能

二者都是从终端(即标准输入设备)读入字符串。

函数 功能说明
gets(buff) 读入一行,并将换行符转换为字符串结束符
scanf("%s",buff) 读入一个字符串,遇到空白字符(包括空格、制表符、换行符)时均会停止输入

 


2. 区别

1)终止条件不同:

函数 终止字符 输入字符串 buff内容
gets(buff) "\n" "test string\n" "test string"
scanf("%s",buff) " "(space)|"\t"|"\n" "test string\n" "test"

 

2)终止字符处理不同:

函数 如何处理终止字符 输入字符串 再次调用getchar()返回结果  结果
gets(buff) "\n"不会留在缓冲区中 "test\nstring" 's'
scanf("%s",buff) "\n"会留在缓冲区 "test\nstring" '\n'  

 


3. 注意事项

  • gets()函数经常和puts()函数配对使用,puts()函数用于显示字符串,并自动在字符串后面添加一个换行标志'\n';
  • gets()函数存在一个严重的缺陷,这个缺陷就是:它不会检查数组是否能够装得下输入行。
  • 可以使用C语言中的gets_s()和fgets()函数来代替gets()函数。

 

有的编译器调用gets函数时会给出warning信息: warning: this program uses gets(), which is unsafe. 

 

这是由于gets()函数没有指定输入字符大小,所以会无限读取,如果输入的字符串过长,会导致缓冲区溢出(buffer overflow),即多余的字符超出了指定的目标空间。gets()函数就会访问未被分配的内存空间,如果这些内存未被使用,不会立即出现问题;如果这片空间已经存有数据,就会擦除掉程序中的其他数据,会导致程序中止。

 

在C99标准中,已经不再建议使用gets()函数,而在C11中则是直接抛弃了这个函数。然而在实际应用中,编译器为了兼容以前的代码,大部分都继续支持gets()函数。

C11标准新增了gets_s()函数可以代替gets()函数,但是,该函数是stdio.h输入输出函数系类中的可选扩展,因此,即使编译器支持C11标准,也有可能不支持gets_s()函数。

 

除此以外,我们可以用c语言中的fgets()函数来代替gets()。

 

综上所述,我们推荐总是使用fgets()函数读取字符串。

 

 


参考资料:

  1. https://zhidao.baidu.com/question/290403568.html
  2. https://www.cnblogs.com/aexin/p/3908003.html
  3. https://blog.csdn.net/libing403/article/details/73010866

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM