c - 关于 char *s_gets(char *st, int n) 的问题
问题描述
我从 C Primer Plus 中阅读了一段代码,并努力理解
char *s_gets(char *st, int n)
.
我不明白的意思if(ret_val)
。我认为可以删除。因为ret_val
不是NULL
,我觉得if(ret_val)
就等于if(1)
。
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;}
这是我第二次编辑。
现在,我的理解如下:
起初,char *s_gets(char *st, int n)
与 具有相似的功能fgets(char *st,n,stdin)
。但不同的是,*s_gets
不会读'\n'
。
我们假设char *st
是“熟能生巧!”。长度约为st
26。
第一种情况,如果0< n < 26
,则if(ret_val)
等价于if(1)
。
第二种情况,如果n == 26
,if(find)
将执行。
最后一种情况 ifn == 0
或n > 26
,ret_val
将是NULL
, 所以 if 语句不会被执行。我对吗?
解决方案
不,支票在那里是有原因的。根据手册页,fgets()
...
fgets()
返回s
成功,NULL
错误或文件结束而没有读取任何字符。
因此,在处理输入之前,我们需要检查fgets()
调用是否成功并且是否已将有效输入读入。st
推荐阅读
- java - 从文件中读取类的对象数组
- python - Python——获取排序列表中元素索引的有效方法,使用多个属性排序
- c - 在内核模块上获得正常运行时间?
- python - python中的圆括号或大括号中不存在逗号上的拆分字符串
- webassembly - 分布式普适计算中的 WebAssembly
- angular - ngSwitch 在评估为 true 时不显示项目
- r - R, rowMeans by Column in data.frame
- c# - Unity C# 对话显示,每个字母在下一个字母部署之前部署两次
- java - Java 中的 wait() 和 notify() 是如何工作的?
- sybase - 编写完整的 Sybase 数据库脚本