首页 > 解决方案 > 关于 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是“熟能生巧!”。长度约为st26。

第一种情况,如果0< n < 26,则if(ret_val)等价于if(1)

第二种情况,如果n == 26if(find)将执行。

最后一种情况 ifn == 0n > 26,ret_val将是NULL, 所以 if 语句不会被执行。我对吗?

标签: cfgets

解决方案


不,支票在那里是有原因的。根据手册fgets()

...fgets()返回s成功,NULL错误或文件结束而没有读取任何字符。

因此,在处理输入之前,我们需要检查fgets()调用是否成功并且是否已将有效输入读入。st


推荐阅读