第一种–通过函数strchr返回字符串中的’\n’,使用一个指针变量接收返回的地址信息,加以判断
.
.
fgets() 虽然比 gets() 安全,但安全是要付出代价的,代价就是它的使用比 gets() 要麻烦一点,有三个参数
。它的功能是从 stream 流中读取 size 个字符存储到字符指针变量 s 所指向的内存空间。它的返回值是一个指针
,指向字符串中第一个字符的地址.
.
.
char *s_gets(char *st, int n)
{
char *ret_val;
char *find;
/*fgets获取的是一行字符串,遇到换行符或读取到n-1个字符时结束读取,前者将换行符保存进字符串st,然后再保存一个空字符*/
/*注意字符串中的空格字符不是'\0'*/
ret_val = fgets(st, n, stdin);
/*成功读取数据为返回str,不成功则返回NULL空指针 */
if (ret_val != NULL)
{
/*strchr是专门搜索字符串中的字符的,遇到'\0'或者找到目标字符就会停止*/
/*查找st所指向的字符串中的换行符'\n',返回指向该字符的指针,未找到返回NULL指针*/
find = strchr(st, '\n');
/*地址内容不为空,表示找到了换行符*/
if (find != NULL)
{
*find = '\0';
}
/*else表示未找到'\n',但是已经搜寻到了字符串末尾,这是因为fgets获取了n-1个字符就结束了*/
else
{
/*此时fgets获取了n-1个字符,屏幕中的输入字符没有读完故使用getchar继续读取,当读取到'\n'时表示该行输入读取完,
目的是为了避免,接下来继续读取字符时,续接之前的输入数据,这实质上是丢弃了第n-1个字符后的多余输入,如果再次获
取输入字符要从下一行开始*/
/*getchar()函数是从标准输入(屏幕)读取下一个字符*/
while (getchar() != NILL)
{
continue;
}
}
}
return ret_val;
}
第二种–判断数组的元素是不是’\n’
char *s_gets(char *st, int n)
{
char *ret_val;
/*fgets获取的是一行字符串,遇到换行符或读取到n-1个字符时结束读取,前者将换行符保存进字符串st,然后再保存一个空字符*/
/*注意字符串中的空格字符不是'\0'*/
//st是数组名,是数组的首地址
//我们将获取到的内容存放进st地址里面
//这里将地址信息赋值给 ret_val,后面用它进行判断操作
ret_val = fgets(st, n, stdin);
/*成功读取数据为返回str,不成功则返回NULL空指针 */
int i = 0;
while (st[i] != '\n' && st[0] != '\0')
{
i++;
}
if (ret_val != NULL) //内容不为空
{
if (st[i] = '\n')
{
st[i] = '\0';
}
/*else表示未找到'\n',但是已经搜寻到了字符串末尾,这是因为fgets获取了n-1个字符就结束了*/
else
{
/*此时fgets获取了n-1个字符,屏幕中的输入字符没有读完故使用getchar继续读取,当读取到'\n'时表示该行输入读取完,
目的是为了避免,接下来继续读取字符时,续接之前的输入数据,这实质上是丢弃了第n-1个字符后的多余输入,如果再次获
取输入字符要从下一行开始*/
/*getchar()函数是从标准输入(屏幕)读取下一个字符*/
while (getchar() != NILL)
{
continue;
}
}
}
return ret_val; //此处的地址信息里的数据,是排除了‘\n’换行符且去除了多余内容(n -1)的数据地址
}