fgets函数(配合问题详解)

简介: fgets函数(配合问题详解)


前言:在运行程序的时候,发现了这样的一个现象

strlen函数是用来求char型数组中元素个数的一个函数,例如:

char a[10]
cin>>a;  //或者是gets_s(a);
cout<<strlen(a);
输入:
123
输出:
3

但是,在用fgets的时候,却出现了这样的结果:

char a[10]
fegts(a,10,stdin);
cout<<strlen(a);
输入:
123
输出:
4

这个时候数组里分明只有3个元素,输出的却是4,这就是由于fgets函数的特性,下面来详细介绍fgets函数


在此之前,先说一个小点:对于char a[20]这样的一个数组来说,只有a[0]到a[19]可以输入字符,末尾一定是是代表结束的 '/0'。


原型:char *fgets(char *s, int size, FILE *stream);

s 代表要保存到的内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名。
size

代表的是读取字符串的长度。(size 如果小于字符串的长度,那么字符串将会被截取;如果 size 大于字符串的长度则多余的部分系统会自动用 '\0' 填充。)

stream 表示从何种流中读取,可以是标准输入流 stdin,也可以是文件流,即从某个文件中读取。标准输入流就是输入缓冲区。所以如果是从键盘读取数据的话就是从输入缓冲区中读取数据,即从标准输入流 stdin 中读取数据,所以第三个参数为 stdin。
 char a[10];            //size小于字符串的长的的情况
    fgets(a,3,stdin);
    cout <<a;
输入:
123
输出:
12       //只会输出size-1个字符

注意点:

如果输入的字符串长度没有超过 n–1,那么系统会将最后输入的换行符 '\n' 保存进来,保存的位置是紧跟输入的字符,然后剩余的空间都用 '\0' 填充。所以此时输出该字符串时 printf 中就不需要加换行符 '\n' 了,因为字符串中已经有了。

这也就解释了开头的问题:为什么输入123却输出4


相关文章
|
Linux Docker 容器
Docker容器运行Linux
Docker容器运行Linux
369 0
|
SQL 分布式计算 Oracle
数据同步工具DataX的安装
数据同步工具DataX的安装
2989 0
|
缓存 算法 Java
这些年背过的面试题——JVM篇
本文是技术人面试系列JVM篇,面试中关于JVM都需要了解哪些基础?一文带你详细了解,欢迎收藏!
|
NoSQL Linux
看懂GDB调试核心:剖析ptrace原理及其应用场景!(上)
看懂GDB调试核心:剖析ptrace原理及其应用场景!
|
缓存 Java
Electron V8排查问题之避免V8FatalErrorCallback崩溃问题如何解决
Electron V8排查问题之避免V8FatalErrorCallback崩溃问题如何解决
315 0
|
机器学习/深度学习 人工智能 算法
ML.NET:一个.NET开源、免费、跨平台的机器学习框架
ML.NET:一个.NET开源、免费、跨平台的机器学习框架
675 2
|
负载均衡
【SpringCloud】Ribbon负载均衡原理、负载均衡策略、饥饿加载
【SpringCloud】Ribbon负载均衡原理、负载均衡策略、饥饿加载
315 0
|
编解码 算法 数据挖掘
单细胞Seurat - 细胞聚类(3)
单细胞Seurat - 细胞聚类(3)
单细胞Seurat - 细胞聚类(3)
|
前端开发
不受限时间段的日期范围选择器DatePicker
不受限时间段的日期范围选择器DatePicker封装记录全过程。
497 1
不受限时间段的日期范围选择器DatePicker
|
传感器 安全
振弦采集仪广泛应用于地铁工程中的地下结构监测
振弦采集仪作为一种先进的监测设备,被广泛应用于地铁工程中的地下结构监测
振弦采集仪广泛应用于地铁工程中的地下结构监测