scanf和scanf_s函数详解

目录

引言:

1.scanf函数的用法:

2.scanf_s函数的用法:

3.scanf和scanf_s的区别:

结论:


引言:

在C语言中,输入函数scanf是非常常用的函数之一,它可以从标准输入流中读取数据并将其存储到指定的变量中。然而,由于scanf存在一些安全性问题,Microsoft C编译器引入了scanf_s函数来解决这些问题。

1.scanf函数的用法:

scanf函数的原型如下:

复制代码
int scanf(const char *format, ...);

它的参数format是一个字符串,用于指定输入的格式,而...表示可以接受任意数量的变量。

例:

cpp 复制代码
#include <stdio.h>
int main()
{
	int num;
	printf("请输入一个整数:");
	scanf("%d", &num);
	printf("您输入的整数是:%d\n", num);

	return 0;
}

在上面的示例中,%d是格式控制符,用于指定输入的数据类型为整数。&num表示输入的整数存储到num中。

2.scanf_s函数的用法:

scanf_s函数的原型如下:

cpp 复制代码
int scanf_s(const char *format, ...);

与scanf函数相比,scanf_s函数多了一个参数用于指定读取的最大字符数。这个参数是为了防止缓冲区溢出而引入的,可以有效地防止一些安全性问题。

例:

cpp 复制代码
#include <stdio.h>
int main()
{
	char str[100];
	printf("请输入一个字符串:");
	scanf_s("%s", str, sizeof(str));
	printf("您输入的字符串是:%s\n", str);

	return 0;
}

在上面的示例中,%s是格式控制符,用于指定输入的数据类型为字符串。str表示将输入的字符串存储到字符数组str中。sizeof(str)表示str的最大字符数,以确保输入的字符串不会导致缓冲区溢出。

3.scanf和scanf_s的区别:

  • scanf函数在读取字符串时,如果输入的字符串长度超过了目标变量的大小,会导致缓冲区溢出,从而引发安全性问题。而scanf_s函数通过添加一个参数来指定读取的最大字符数,可以避免这个问题。
  • scanf_s函数在读取字符串时,要求输入的字符必须以空字符'\0'结尾。如果输入的字符串没有以'\0'结尾,scanf_s函数会返回一个错误码,并且不会将任何字符存储到目标变量中。
  • 两者主要是输入字符和字符串时有所区别。

cpp 复制代码
#include <stdio.h>

int main()
{
	char arr[20] = { 0 };
	char ch = 0;
	//读取一个字符
	//第三个参数决定读取一个字符
	scanf_s("%c", &ch, 1);
	printf("%c\n", ch);

	return 0;
}


cpp 复制代码
#include <stdio.h>

int main()
{
	char arr[20] = { 0 };
	//读取一个字符串
	//第3个参数指定了读取字符的个数,实际读取19个,最后一个放\0
	scanf_s("%s", arr, 20);
	printf("%s\n", arr);

	return 0;
}

结论:

在C语言中 ,输入函数scanf和scanf_s都可以用于从标准输入读取数据,然而,为了提高程序的安全性,推荐使用scanf_s函数,并在读取字符串时指定最大字符数,以避免缓冲区溢出的问题。

相关推荐
深圳雨林凯AI4 小时前
图案裂变的“风格归一化“设计思路:主体保得住,画风才拉得齐|雨林凯AI技术笔记
人工智能·笔记
南棱笑笑生4 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
冬木家居6 小时前
40㎡客厅变形记,小家住出大自由[特殊字符]
android·经验分享·笔记·智能家居·微信公众平台
摇滚侠6 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 数据库初始化机制 阅读笔记 36
数据库·spring boot·笔记
推送者8 小时前
用宠物照片制作桌宠:从AI拆帧到九点标定的本地化实现笔记
笔记·宠物·用宠物照片制作桌宠
一条破秋裤8 小时前
16_TIM编码器接口测速
笔记·stm32·学习
tju新生代魔迷8 小时前
Verilog HDL 学习笔记(十)| 第10章 时序和延迟
笔记·学习·fpga开发
2601_9622959910 小时前
嵌入式开发语言用哪个最好,C,python或者其他
c语言·python·嵌入式开发·开发效率·系统资源
血小板要健康10 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
浔溺10 小时前
al+大数据每日学习笔记31
大数据·笔记·学习