gets函数介绍:
函数原型:char *gets(char *s);
需要的头文件:#include <stdio.h>
函数功能:从标准输入读入字符,并保存到s指定的内存空间, 直到出现换行符或读到文件结尾为止。
参数:s:字符串首地址
返回值: 成功:读入的字符串 失败:NULL
gets(str)与scanf("%s",str)的区别:
- gets(str)允许输入的字符串有空格,scanf("%s",str)不允许含有空格
- scanf碰到缓冲区里面的空字符(空格,tab,回车,换行就会截断并添加\0),而gets是要等回车才截断字符串并添加\0的
注意事项:
由于scanf()和gets()无法知道字符串s大小,必须遇到换行符或读到文件结尾为止才接收输入,因此容易导致字符数组越界(缓存区溢出)的情况
程序代码:
#include <stdio.h>
int main(void)
{
char ch1 = 'A';
char str[5];
printf("input str:");
gets(str);
printf("str=%s\n",str);
printf("ch1 = %c\n",ch1);
return 0;
}
各种输入操作
正常输入后运行结果:
当输入的字符个数在5个以内时,程序正常输出。
非正常输入后运行结果:
当连续输入16个数字字符时,程序没有报错,但字符变量ch1的值被改变。这是由于数组越界访问,篡改了其他变量的值。
暴力输入后运行结果:
当输入一大段字符串时,发生了段错误,在gcc编译器上段错误一般是指非法访问内存空间。
解决办法:
- 使用更安全的fgets()函数。
- 定义足够大的数组空间
- 提示输入的用户, 比如:
printf("请输入不超过5个字符的字符串:");