由于gets()函数会导致段错误,超出数组下标造成越界,所以了解了以下函数
fgets( 数组名, sizeof(数组名),流(一般键盘输入为stdin))
fgets()函数的好处是防止了内存溢出,由于获取了数组长度,不会发生段错误
fgets()读取字符串长度为读取数组长度n-1位,若数组空间足够大,回车键字符‘\n’也会被读取进数组,并且在最后一位补‘\0’表示字符串结束
一般分以下两种情况:
数组长度为5
输入abcdefg’\n’
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
a | b | c | d | ‘\0’ |
数组长度为10
输入abcdefg’\n’
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
a | b | c | d | e | f | g | ‘\n’ | ‘\0’ |
多余的数据会留在缓冲区
由于linux环境下fflush()函数没法使用(编译不报错,但功能不实现)
第二次调用会把上次缓冲区多余的字符读进来,所以需要一个清除缓冲区的函数来实现
一般清除缓冲区可以用一下方法
char ch;
do{
ch = getchar();
}while(ch != '\n'); //读到回车退出循环
但是fgets()有时会把回车读走,因此每次清除缓冲区之前还需要判断fgets()是否有遗留
代码如下
#include <stdio.h>
#include<string.h>
void clean();
int main()
{
char num[12], nu[12]; //fgets()最多能读取n-1个字符,但我为了去掉‘\n’预留了一位用作替换
char c;
fgets(num,sizeof(num),stdin); //键盘输入
if(num[strlen(num)-1] != '\n') //若没有获取到'\n',表示缓冲区有遗留
clean(); //清除缓冲区
num[strlen(num)-1] = '\0'; //统一将系统默认补‘\0’前一位替换成'\0',若有回车将会被消除
fputs(num,stdout); //屏幕输出
fputc('\n',stdout); //输出换行
fgets(nu,sizeof(nu),stdin); //键盘输入
if(nu[strlen(nu)-1] != '\n') //同上
clean();
nu[strlen(nu)-1] = '\0';
fputs(nu,stdout);
fputc('\n',stdout);
return 0;
}
void clean() //清除缓冲区
{
char ch;
do{
ch = getchar();
}while(ch != '\n');
}
运行结果如下