c语言获取终端输入字符串的函数scanf,gets,fgets

2023-05-16

获取终端输入字符串scanf,gets,fgets

获取终端中输入字符串,我们常用getchar(),scanf(),gets(),和fgets()函数实现,这里简单汇总一下:

​ scanf() 函数可以获取到终端字符串,但是不能识别到空格字符,遇到空格会终止,空格后面的字符串会在缓冲区中,下次获取时会继续用。

​ gets()函数以回车字符进行标识,获取用户输入字符串以回车为终止符。

​ scanf和gets函数都是不安全的,如果目标字符串缓冲区无法存储我们输入的字符串,会导致段错误

​ fgets()函数限定了获取字符串的长度,如果输入字符串过多,依然可以只获取限定长度的字符串,剩下的字符串还在输入缓冲区中。

测试demo以及输入测试描述:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//scanf输入遇到空格会当成结束符
//gets是遇到回车结束 fgets其实对gets的一些完善扩展
int main()
{
//scanf 读取终端内容时  遇到空格会终止
// 终止后剩余的结果其实还在终端缓冲区中,会在后面读取缓冲区继续生效
	char data[20];
	printf("please test of scanf :\n");
	scanf("%s", data);
	printf("scanf func get data is [%s] \n", data);
	memset(data, 0, 20);
	printf("please test of space scanf :\n");
	scanf("%s", data);
	printf("scanf func get data is [%s] \n", data);
	memset(data, 0, 20);
	fflush(stdin);	//可以刷新缓冲区 一般用在读数据后没读完

//gets可以读取换行前的所有字符,但是gets是不安全的,如无法保证长度越界
	printf("please test of gets \n");
	gets(data);
	printf("gets func get data is [%s] \n", data);
	memset(data, 0, 20);
	printf("please test of space gets :\n");
	gets(data);
	printf("gets func get data is [%s] \n", data);
	memset(data, 0, 20);
//使用fgets函数  对gets函数的扩展,限定了读取数据的长度
	printf("plese test of fgets : \n");
	fgets(data,  20, stdin); //字符串地址  字符串长度   读入的文件   
	printf("fgets func get data is : [%s]", data);

	memset(data, 0, 20);
	printf("please test of len out of 20 fgets:\n");
	fgets(data,  20, stdin);
	printf("fgets func get data is : [%s] \n", data);
	memset(data, 0, 20);
	fflush(stdin);
	return 0;
}


/********************************************
输出的结果:
hlp@ubuntu:~/com_port$ ./in
please test of scanf :   ==>scanf正常输入
12334
scanf func get data is [12334]  ==》打印获取终端的输入
please test of space scanf :	==》scanf输入带空格的字符串
123 1231 
scanf func get data is [123]    ==》发现只打印了空格前的字符串
please test of gets 
gets func get data is [ 1231 ] 	==》没有经过手动输入, get函数直接获取到终端缓冲区中已经存在的字符串
please test of space gets :		==》get函数测试带空格的字符串
123 123 412
gets func get data is [123 123 412]  ==》get函数能打印带空格的字符串,终结符以回车为准
plese test of fgets : 			==》测试fget函数获取,在长度内,发现获取到终端内的回车字符
123123 123 1
fgets func get data is : [123123 123 1
]please test of len out of 20 fgets:	==》如果超过fgets函数参数限制的长度,获取到输入的固定长度字符19个字符
12312 1231231 12312 123123 12312123
fgets func get data is : [12312 1231231 12312]
**************************************************/


/********************************************
可以看出,输入字符串过长,scanf和get函数如果获取长度过多,都会引发段错误
hlp@ubuntu:~/com_port$ ./in
please test of scanf :
1
scanf func get data is [1] 
please test of space scanf :
1
scanf func get data is [1] 
please test of gets 
gets func get data is [] 
please test of space gets :
111111111111111111111111111111111111111111
gets func get data is [111111111111111111111111111111111111111111] 
plese test of fgets : 
12
fgets func get data is : [12
]please test of len out of 20 fgets:
12
fgets func get data is : [12
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)

hlp@ubuntu:~/com_port$ ./in
please test of scanf :
111111111111111111111111111111111111111
scanf func get data is [111111111111111111111111111111111111111] 
please test of space scanf :
11111111111111111111111111111111111
scanf func get data is [11111111111111111111111111111111111] 
please test of gets 
gets func get data is [] 
please test of space gets :
1
gets func get data is [1] 
plese test of fgets : 
1
fgets func get data is : [1
]please test of len out of 20 fgets:
1
fgets func get data is : [1
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)

**************************************************/

/********************************************
可以看出,输入字符串过长,如果用fget函数进行获取,会在限制长度内获取,下次继续获取缓冲区中剩余字段
hlp@ubuntu:~/com_port$ ./in
please test of scanf :
1
scanf func get data is [1] 
please test of space scanf :
1
scanf func get data is [1] 
please test of gets 
gets func get data is [] 
please test of space gets :
1
gets func get data is [1] 
plese test of fgets : 
1111111111111111111111111111111111111111111111111111111111111111111111111
fgets func get data is : [1111111111111111111]
please test of len out of 20 fgets:
fgets func get data is : [1111111111111111111]
**************************************************/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言获取终端输入字符串的函数scanf,gets,fgets 的相关文章

随机推荐

  • AHB-APB总线协议

    AHB APB总线协议 文章目录 AHB APB总线协议一 AHB APB总线介绍二 AHB总线设备1 AHB主设备 xff08 master xff09 2 AHB从设备 xff08 slave xff09 3 AHB仲裁器 xff08
  • Modelsim缺失库快速添加

    Modelsim缺失库快速添加 文章目录 Modelsim缺失库快速添加前言一 ini文件二 器件库配置1 将器件库放在modelsim文件夹下2 ini配置文件修改 前言 在单独使用modelsim时 xff0c 假如要编译复杂的工程文件
  • AHB-APB_Lite总线协议及Verilog实现

    AHB APB Lite总线协议及Verilog实现 文章目录 AHB APB Lite总线协议及Verilog实现一 AHB Lite协议介绍二 系统框架介绍三 代码设计四 仿真测试 一 AHB Lite协议介绍 AHB xff08 Ad
  • 通信协议详解(二):IIC总线协议(传输时序+数据格式+设计实现)

    文章目录 一 IIC xff08 Inter Integrated Circuit xff09 介绍二 传输协议1 时序传输时序写操作时序数据有效性开始 amp 结束信号从机应答信号 2 数据格式 三 设计实现1 时钟2 传输过程3 三态门
  • Qt error ------ 'XXX' has not been declared

    1 头文件没加 2 调用函数者的头文件在XXX头文件的下方 转载于 https www cnblogs com god of death p 8572306 html
  • Command Expert安装

    一 安装准备 需先下载两个安装包 1 Commmand Expert安装包 https www keysight com cn zh lib software detail computer software command expert
  • Vitis开发(一):Vivado启动vitis

    Vitis是Xilinx SDK的继承开发工具 xff0c 从Vivado 2019 2版本开始启用 在Vivado 2019 1及更早版本中 xff0c 导出的硬件描述文件为 hdf文件 xff0c 给xilinx sdk使用 在Viva
  • 数字IC刷题(一)

    一 选择 1 To achieve better leakage cells are placed A HVT B LVT C RVT 解 LVT Low V threshold xff1a 低阈值 这种库的漏电流较大 xff0c 但是延迟
  • CPU设计-分支预测

    目录 CPU分支指令类型分类 1 xff09 无条件跳转 xff0f 分支 xff08 Unconditional Jump Branch xff09 指令 无条件直接跳转 xff0f 分支 xff1a 无条件间接跳转 xff0f 分支 x
  • 数字世界的积木-从MOS管搭反相器,与非门,锁存器,触发器

    文章目录 一 MOS管MOS管搭建反相器MOS管搭建传输门MOS管搭建与非门 二 与非门R S锁存器三 电平触发器电平触发RS锁存器带异步复位 xff0c 异步置位的电平触发RS锁存器电平触发D触发器 四 边沿触发器 一 MOS管 NMOS
  • 内存对齐规则

    每个特定平台上的编译器都有自己的默认 对齐系数 也叫对齐模数 程序员可以通过预编译命令 pragma pack n xff0c n 61 1 2 4 8 16来改变这一系数 xff0c 其中的n就是你要指定的 对齐系数 规则 xff1a 1
  • EGO-Planner: An ESDF-free Gradient-based Local Planner for Quadrotors(论文笔记)

    EGO Planner An ESDF free Gradient based Local Planner for Quadrotors xff08 论文笔记 xff09 ESDF欧式符号距离场避碰力估算基于梯度的轨迹优化平滑惩罚障碍惩罚可
  • 计算机组成原理系列(三):计算机存储器结构体系详解

    x1f525 Hi xff0c 我是小余 本文已收录到 GitHub Androider Planet 中 这里有 Android 进阶成长知识体系 xff0c 关注公众号 小余的自习室 xff0c 在成功的路上不迷路 xff01 前言 生
  • linux下怎么使用C语言编写接收和发送udp组播数据?

    一 xff0c 发送端 代码如下 xff1a 先调用initUdpMultiCastSender初始化 xff0c int initUdpMultiCastSender uint32 t localip uint16 t localport
  • MQTT 及其 测试工具

    协议说明书 xff1a https mcxiaoke gitbooks io mqtt cn content mqtt 04 OperationalBehavior html 官网提供了很多的broker模拟器 xff0c 地址 xff1a
  • OpenCV安装教程:Windows 安装 Visual Studio + OpenCV + OpenCV contrib

    目录 0 写作背景 1 安装visual studio 2 下载OpenCV相关的源码 下载OpenCV原始的源码 下载OpenCV contrib的源码 下载安装cmake 3 cmake编译OpenCV 初始编译 CmakeDownlo
  • 图像分类、目标检测、图像分割----简介

    1 图像分类 xff1a 单任务算法 1 1 公开数据集 xff1a xff08 1 xff09 MNIST xff1a 10个类别 xff0c 手写数字体数据集 xff0c 6万条训练数据和1万条测试数据 xff0c 28 28的灰度图
  • cmake基本用法

    一 cmake命令 1 基本用法 cmake 选项 lt 源码路径 gt CMake可执行程序是CMake的命令行界面 它可以用脚本对工程进行配置 工程配置设置可以在命令行中使用 D选项指定 使用 i选项 xff0c cmake将通过提示交
  • Okhttputils终极封装

    前言 项目源码 https github com yulyu2008 XiayuOkHttp Okhttputils是张鸿洋基于okhhttp封装的一个框架 使用起来很方便 相信很多人都用到过 这里我们在这个框架的基础上二次封装 让我们用起
  • c语言获取终端输入字符串的函数scanf,gets,fgets

    获取终端输入字符串scanf gets fgets 获取终端中输入字符串 xff0c 我们常用getchar scanf gets 和fgets 函数实现 这里简单汇总一下 xff1a scanf 函数可以获取到终端字符串 xff0c 但是