关于fgets的理解

Posted 9527s

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于fgets的理解相关的知识,希望对你有一定的参考价值。

gets()函数

    因为用gets函数输入数组时,只知道数组开始处,不知道数组有多少个元素,输入字符过长,会导致缓冲区溢出,多余字符可能占用未使用的内存,也可能擦掉程序中的其他数据,后续用fgets函数代替。

fgets函数

    一小段代码举例:

    

1 char words[stlen];
2     fgets(words,10,stdin);
3      fputs (words,stdout);
4     puts(words);

 

    (1)  fgets函数一次读入10 - 1个字符,如果少于这个字符数数按下回车

    例如输入apple pie 则会将apple pie 储存在数组中

    随后的fputs打印时不添加

    而puts打印会添加 ,结果会空一行

    (2) 一次读入超过10 - 1个字符则会在读取apple pie后加储存在数组中

      打印时因为没有     函数fputs之后没有换行,紧接着puts打印

 

    fgets()函数读到文件结尾会返回一个空指针,代码可用0代替,或者用NULL  //因为暂时不常见在此不做介绍

 

    在11.8中

# include<stdio.h>
# define stlen 10
int main(void)
{
    char words[stlen];
    while(fgets(words,stlen,stdin) != NULL&&words[0] != 
)//不断循环把stlen-1字符放在数组中加,直到最后结尾为
,
       fputs(words,stdout);
    puts("done.");



    return 0;
}

    输入字符长度超过 10-1 时仍会全部打印,因为输入缓冲区的原因,输入aaaaaaaaabbbbbbbbbccccccccc,字符串会在缓冲区暂时保存,第一次while会将aaaaaaaaa输出但没有换行,

第二次时bbbbbbbbb,最后的c结束时会将ccccccccc 储存打印时会换行。

    储存换行符有好处也有坏处,想去除换行符,可以在已知的字符串中查找换行符,

     while (words[i] != ‘ ‘)

      i++;

   word[i] = ‘‘;

    如果仍有字符串留在输入行就用

      

while(getchar() != 
)//读取但不储存输入,包括

    continue;

    这样可以清除缓冲区,超过设定长度会将后面的清除,只打印设定长度字符串。

 1 # include<stdio.h>
 2 # define stlen 10
 3 int main(void)
 4 {
 5     char words[stlen];
 6     int i;
 7     while(fgets(words,stlen,stdin) != NULL&&words[0] != 
)
 8     {
 9         i = 0;
10         while(words[i] != 
&&words[i] != )
11             i++;
12         if(words[i] == 
)
13             words[i] == ;
14         else             //也就是words[0] == ‘‘时
15             while(getchar() != 
)
16             continue;
17 
18         puts(words);
19 
20     }
21     return 0;
22 }

 

    上述代码,若输入apple   则输出apple

      若输入aaaaaaaaabbbbbbb  则输出aaaaaaaaa  因为在输入后缓冲区是aaaaaaaaabbbbbbb,读取规定字符数将aaaaaaaaa放在words中,后续代码检测到

     因为getchar()缓冲区的字符b依次被读取并被丢弃,知道读取到换行符 ,输出words     //  也被丢弃。

      

以上是关于关于fgets的理解的主要内容,如果未能解决你的问题,请参考以下文章

金蝶handler中 collection 代码片段理解

关于代码片段的时间复杂度

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

#yyds干货盘点# Java | 关于synchronized相关理解

如何理解这段代码片段中的两对括号?

关于Activity和Fragment生命周期的问题