一、前提
在main函数中定义了一个字符数组,需要使用s_gets函数读取输入到该数组中
二、s_gets函数代码
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st,n, stdin);
if (ret_val)
{
find = strchr(st, '\n');
if (find)
*find = '\0';
else
while (getchar() != '\n')
continue;
}
return ret_val;
}
2.1参数
参数一:指针st,指向main函数中的字符数组;参数二:整型n,限制读取的字符串大小
2.2fgets函数
ret_val = fgets(st,n, stdin);
定义指针ret_val用于接收fgets函数的返回值。fgets函数有三个参数,表示从标准输入流中最多获取n-1个字符到指针st指向的数组中,第n个位置自动添加‘\0’。fgets函数读取成功返回st,读取失败或者读到文件末尾返回NULL指针
2.3替换‘\n’或舍弃多余输入
if (ret_val)
{
find = strchr(st, '\n'); //查找字符函数
if (find)
*find = '\0';
else
while (getchar() != '\n')
continue;
}
如果fgets函数读取成功,则进入该if判断。假设fets中的参数n为5,我们输入3个字符后按回车结束输入,则st指向的数组中将存放3个字符、一个‘\n’和一个‘\0’。而这个‘\n’并不是我们想要的,所以需要查找并替换‘\n’。
2.3.1查找并替换‘\n’
find = strchr(st, '\n'); //查找字符函数
if (find)
*find = '\0';
strchr函数在指针st指向的数组中查找第一个‘\n’(从st指向的地址开始查找,也即数组首元素),查找成功后,返回指向该‘\n’的指针。若查找失败,返回NULL指针。
接上文的假设,strchr函数查找到字符数组第4个位置存放的‘\n’后,进入if(find)判断,再然后通过*find = ‘\0’替换该‘\n’。
2.3.2舍弃多余输入
假设fgets中的参数n为5,而我们输入10个字符后按回车结束输入。则st指向的数组中将存放4个字符和一个‘\0’。此时缓冲区中还剩余6个字符和一个‘\n’未被读取,如果不将这6个字符舍弃,那么当下次再调用fgets函数时,无论输入多少字符,都只会先从上次剩余的字符中读取!
else
while (getchar() != '\n')
continue;
因为st指向的字符数组中没有‘\n’,所以进入else语句,通过getchar()函数配合while循环将缓冲区剩余的字符读出,直到读到‘\n’跳出循环,并结束else语句。这样就实现了将多余输入清除的目的。
注:continue在此处写不写并无影响