为了账号安全,请及时绑定邮箱和手机立即绑定

c语言的问题,不太理解这个函数,大神给解释一下?

c语言的问题,不太理解这个函数,大神给解释一下?

手掌心 2019-02-05 10:06:34
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] != '\0' && st[i] != '\n')i++;if (st[i] == '\n')st[i] = '\0';elsewhile (getchar() != '\n')continue;}return ret_val;}
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

fgets函数原型char *fgets(char *buf, int bufsize, FILE *stream);参数*buf: 字符型指针,指向用来存储所得数据的地址。bufsize: 整型数据,指明存储数据的大小。*stream: 文件结构体指针,将要读取的文件流。含义:从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。函数成功将返回buf,失败或读到文件结尾返回NULL。

----------------------------以上说明,引用百度知道,“修者世界 ”的发言,不是本人编著

下面我对你这个代码补充说明:

stdin是C语言中标准输入流,一般用于获取键盘输入

所以代码 ret_val = fgets(st, n, stdin); 这里意思:

从键盘读入n位字符+结束'\0’存放到st数组中。

而判断if (ret_val){。。。。这里的意思:

当键盘输入的字符大于一次读取缓存空间st时(ret_val 以‘\0’结尾),通过               getchar()截取掉键盘缓冲区剩余字符。并返回 ret_val 。

当键盘输入的字符小于一次读取缓存空间st时(ret_val 以回车‘\n’结尾),

将结尾的'\n'替换成'\0',并返回ret_val 。

所以总结:

char * s_gets(char *st, int n)的意思就是: 传参数组指针st、数组大小n。返回键盘输入的字符串前n-1个字符。

比如,main函数调用,定义6维度大小的数组

12345678int main(){    char buf[6],*restr;    int n=sizeof(buf);    restr=s_gets(buf,n);    printf("%s",restr);    return 0;}

输入9个字符。打印前5个。

输入4个字符。打印全部。



查看完整回答
反对 回复 2019-03-14
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

大致意思是一次从stdin读取一行,最多n个字符, 如果n个里面包含回车,截取回车前面的
如果不包含回车,一致读直到读到回车

或者

返回一个指向字符串的指针

查看完整回答
反对 回复 2019-03-14
  • 3 回答
  • 0 关注
  • 889 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信