• 对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     //  也被丢弃。

          

  • 相关阅读:
    2019.4.18 淘宝商品显示块2号铺设练习
    Debuggee not connected 寒江孤钓<<windows 内核安全编程>> 学习笔记
    指定的服务已标记为删除 寒江孤钓<<windows 内核安全编程>> 学习笔记
    删除自定义服务 寒江孤钓<<windows 内核安全编程>> 学习笔记
    发生系统错误 1275.此驱动程序被阻止加载 寒江孤钓<<windows 内核安全编程>> 学习笔记
    无法编译出.sys文件 寒江孤钓<<windows 内核安全编程>> 学习笔记
    iOS11 适配
    curl
    ddd
    201060512 viewcontroller view
  • 原文地址:https://www.cnblogs.com/9527s/p/9332903.html
Copyright © 2020-2023  润新知