版权声明:本文为博主原创文章,转载请附上博文链接。
在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()函数读取字符串。
参考资料:
- https://zhidao.baidu.com/question/290403568.html
- https://www.cnblogs.com/aexin/p/3908003.html
- https://blog.csdn.net/libing403/article/details/73010866