*s_gets的用法及getchar()!='\n'的意义作用

作者:二货道士链接:https://www.zhihu.com/question/66641003/answer/249038997来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
s_gets()函数的用法:

char *s_gets(char * st,  int n){ 
       char * ret_val;
       int i = 0;
       ret_val = fgets(st, n, stdin); 
       if  (ret_val)  
       {       
           while (st[i] != '\n' && st[i] != '\0')         
                    i++;         
            if (st[i] == '\n')     
                     st[i] = '\0';          
             else          //如果此时先读到了结束符'\0'
                      while (getchar() != '\n')                     
                                   continue;        
/**        
        while (getchar()!='\n') ;  表示循环读入字符,直到读到回车符结束循环。

我们在输入一个数据时,一般都会按回车来确认输入结束,可是scanf()函数对最后的回车确认符并不丢弃,而是存储在缓存中,这样如果,下一个操作是读字符操作,则会将缓存中的回车符误读为实际数据,而造成程序运行异常。因此,在确认输入一个数据后,要回车来确认时,可通过while (getchar()!=’\n’) ;来清除缓存中的垃圾数据。
这个语句,还可以做到清除输入多余的字符,
如:1234char ch[11]; //最多能存储10个字符
getline( ch, 10 ); //输入10个字符,可是用户有可能输入10个以上的字符,于是可用上面的语句来清除缓存的数据。
while (getchar()!=’\n’) ;这样,后续的读数据操作,就不会受这里的输入影响了。
*/
}
return ret_val;
}
fgets的作用是读取字符

串,直至达到最大字符数量或遇到第一个换行符为止,且fgets会把读取到的换行符储存在字符串中(fgets函数为<stdio.h>输入输出函数系列的可选扩展,可直接调用,用法应该也找到的,就不再赘述)。
有些时候为了避免换行符储存在字符串中,字符串中有换行符可能会带来一些麻烦,就创建了s_gets()函数,其作用是读取整行输入并用空字符代替换行符,或读取一部分输入,并丢弃其余部分
如果fgets成功读取到了字符串则进入if判断语句,通过循环找出字符串中的换行符或空字符。
fgets函数读到换行符时就会停止读入字符,如果找到换行符,if语句就会将其变为空字符并返回字符串,若while循环读取到了空字符,由于空字符象征着字符串的结束,此时需要丢弃输入行的余下字符。
因为输入行中多出来的字符会被留在缓冲区中,成为下一次读取语句的输入,假设下一条语句要读取一个char类型的值,就可能导致程序崩溃,丢弃输入行余下的字符保证了读取语句和键盘输入同步

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值