fgets函数和缓冲区示例

fgets函数是gets函数的替代品,C11标准已经废除gets函数.

  • fgets函数的第2个参数, 它指明了读入字符的最大数量,一般传入数组的长度,如果该参数的值是n,那么fgets将读入包括换行符在内的n-1个字符,数组最后一个位置会自动存空字符'\0'.
  • fget的返回值为一个char *指针,指向输入的内容第一个字符

下面回显程序去掉了fgets读取的换行符,如果输入字符过多则丢弃

#include 
#define STLEN 10
int main(void)
{
    char words[STLEN];
    int i;
    
    puts("Enter strings (empty line to quit):");
    puts("------------------");        
    while (fgets(words, STLEN, stdin) != NULL
                          && words[0] != '\n')
    {   

        i = 0;
        while (words[i] != '\n' && words[i] != '\0')
            i++;
        if (words[i] == '\n')
        {
            printf("i = %u  replace \'\\n\'  to \'\\0\' \n",i);
            words[i] = '\0';
        }
        else // must have words[i] == '\0'
        {   
            printf("words[%u] == \'\\0\' \n",i);
            while (getchar() != '\n')// 获取缓冲区下一个字符
                // continue;//作用是丢弃剩余的字符
                puts("continue");
        }

        // for(int j=0;j

下面是程序的输出示例

Enter strings (empty line to quit):
------------------
12345678
words[8] replace '\n'  to '\0'
12345678

键盘输入12345678,那么包括回车换行符共向程序缓冲区输入了9个字符:12345678\n,fgets 全部获得.
则存在数组中的为10个字符:12345678\n'\0',然后替换成了12345678'\0''\0'
------------------
123456789
words[9] == '\0'
123456789

输入123456789\n, 缓冲区共10个字符, fgets获得9个字符,则存在数组中的为123456789'\0'
此时还有个换行符\n存在缓冲区,由getchar()取出,然后什么都不做进入下一轮主循环
------------------
1234567890
words[9] == '\0'
continue
123456789

输入1234567890\n, 缓冲区共11个字符, fgets获得9个字符,则存在数组中的为123456789'\0'
此时还有个0和换行符在缓冲区,getchar()先取出0打印continue然后取出换行符while结束,进入下一轮主循环
------------------

你可能感兴趣的:(fgets函数和缓冲区示例)