小结——scanf和scanf_s的区别以及最近练习的一些习题

10 篇文章 0 订阅
订阅专栏

1.scanf和scanf_s()

1.VS2019:scanf返回值被忽略

百度后得知原因为:scanf()函数在读取时不检查边界,所以可能会造成内存泄漏,有一定的安全隐患。例如代码:

char a;
scanf("%c",&a);

scanf只有一个%c,当你输入两个以上的字符时,就会发生内存溢出,有一定的安全隐患。

微软公司觉得scanf()函数不安全,所以在VS编译器中提供了scanf_s()函数,这是VS编译器特有的函数。

2.scanf_s函数报错:没有为格式 字符串传递足够的参数。

解决办法为:在使用%c和%s读入字符或字符串时,应在地址参数后附加一个缓冲区边界值。 

例如:

#include<stdio.h>
int main()
{
	char c;
		printf("Input a character: ");
		scanf_s("%c1", &c,sizeof(int));
		if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
			printf("It is an English character.\n");
		else if (c >= '0' && c <= '9')
			printf("It is a digit character.\n");
		else
			printf("It is other character.\n");
		return 0;
}

首先我们来看一下scanf和scanf_s的区别
scanf()不会检查输入边界,可能造成数据溢出。
scanf_s()会进行边界检查。

因此在调用scanf()函数时,必修提供一个数字来表明最多读取多少位字符。所以scanf_s需要输入三个参数。

2.习题总结

1.输入除数与被除数,输出商


#include<stdio.h>
int main()
{
	double x, y;
	double result;
	printf("请输入被除数:");
	scanf_s("%1f", &x);
	printf("请输入除数:");
	scanf_s("%1f", &y);
	if (y != 0)
	{
		result = x / y;
		printf("两个数的商:%.2f\n", result);
	}
	else
	{
		printf("除数为零!\n");
	}
	result = x / y;
	printf("两个数的商:%.2f\n", result);
}


2.输入给的金额,输出找回的金额

#include<stdio.h>
int main()
{
	int price = 0;

		printf("请输入金额(元):");
	scanf_s("%d",&price);
	int change = 100 - price;
	printf("找您%d元。\n", change);
	return 0;
}

3.判断输入的字符是英文字符还是数字或是其它

#include<stdio.h>
int main()
{
	char c;
		printf("Input a character: ");
		scanf_s("%c1", &c,sizeof(int));
		if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
			printf("It is an English character.\n");
		else if (c >= '0' && c <= '9')
			printf("It is a digit character.\n");
		else
			printf("It is other character.\n");
		return 0;
}

4.输入一行字符,判断其字母数、空格数、数字数、其它字符数

#include<stdio.h>
int main()
{
	char c;
	int letters = 0, space = 0, dight = 0, other = 0;
	printf("请输入一行字符:\n");
	while ((c = getchar()) != '\n')
	{
		if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
			letters++;
		else if (c == ' ')
			space++;
		else if (c >= '0' && c <= '9')
			dight++;
		else
			other++;

	}
	printf("字母数%d,空格数%d,数字数%d,其他字符%d", letters, space, dight, other);
	return 0;
}

5.输入两个正整数m和n,求其最大公约数和最小公倍数

#include<stdio.h>
int main()
{
	int m, n, p, q, temp;
	scanf_s("%d%d", &m, &n);
	if (n < m)
	{
		temp = n;
		n = m;
		m = temp;
	}
	p = n * m;
	while (m != 0)
	{
		q = n % m;
		n = m;
		m = q;
	}
	printf("最大公约数是:%d\n", n);
	printf("最小公倍数是:%d\n", p / n);
	return 0;
}

 6.求100以内的素数

#include<stdio.h>
int main()
{
	int i, j;
	for (i = 2; i <100; i++)
	{
		for (j = 2; j < 100; j++)
		{
			if (i % j == 0)
				break;
		}
		if (j >= i)
			printf("%d ", i);
	}
	return 0;
}

 

 7.while()是循环语句的开始,后面一般不加分号,如果加上分号,则表示循环体为

8.break语句不是只能在循环结构中使用,还可在switch语句中使用,不可单独使用或用于其它语句中。

【C/C++scanf()和scanf_s()区别、字符串操作函数
骑猪看彩虹的博客
04-27 2033
scanf()和scanf_s()区别 很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素。scanf_s()是scanf()的安全版本,例如使用scanf()格式为scanf("%s",&a);则使用scanf_s()格式为scanf("%s",&a,num),其中num为为a数组分配的长度; ANSI C中没有scanf_s(),...
[学习记录]C Primer Plus(第6版)编程练习题 答案(带运行结果)——第4章
cooperlong的博客
07-29 144
C primer plus 第六版 第四章编程练习答案附带运行结果。零基础开始学这个书,学到哪儿做到哪儿。
scanfscanfs的区别
12-02 1442
scanf()函数是标准C中提供的标准输入函数,用以用户输入数据 scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。 原因和区别scanf()在读取数据时不检查边界,所以可能会造成内存访问越界: //例如:分配了...
C知识扫盲------scanf() 和 scanf_s()与缓冲区
最新发布
2401_82676816的博客
08-06 2288
scanf() 和 scanf_s() 是 C 语言中用于从标准输入读取格式化数据的函数。它们通过指定格式说明符,从输入流中读取并解析数据,然后存储在对应的变量中。scanf() 和 scanf_s() 是用于读取标准输入的函数,但在使用时需要特别注意安全性。缓冲区溢出是常见的安全问题,scanf_s() 通过要求指定缓冲区大小来防止这种问题。了解缓冲区的作用和常见错误,以及使用 scanf_s() 等安全函数,可以有效避免程序中的安全漏洞,确保程序的安全性和稳定性。
scanfscanf_s的区别
weixin_45963815的博客
03-29 3990
再写程序的时候一般都是用vs,调试的时候用dev-c++(写程序的时候用vs真的可以少打好多字),但是发现dev-C++中对scanfscanf_s都可以进行编译,但是vs只能编译scanf_s,但是编译scanf的时候一直报错,那么scanfscanf_s有什么区别呢? scanf()函数是标准C中提供的标准输入函数,用以用户输入数据 scanf_s()函数是Microsoft公司VS开发工...
<C语言学习>scanfscanf_s的区别
小李子还挺酸的博客
03-06 3568
scanf()不会检查输入的边界,因此输入的数据可能会溢出,导致程序出错 scanf_s()更安全,其会检查输入的边界 如: char ch[6]; scanf("%s",ch); 若此时输入数据为abcdefghijk,则f以后的内容将溢出到别的空间,可能会导致程序运行错误 若使用 scanf_s("%s",ch); 则输入数据abcdefghijk,只会接受abcdef六个输入,其余的不接受 若是 scanf_s("%s",ch,6); 则输入数据abcdefghijk,只会接受abcde五个输.
scanf()与scanf_s()的区别
suzhigao的博客
07-27 4万+
scanf() 函数 : scanf() 函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。 其调用格式为:scanf("<格式化字符串>",<地址表>)。 scanf_s()函数: scanf_s() 的功能虽然与scanf() 相同,但却比 scanf() 安全,因为 scanf_s() 是针对“ scanf()在读取字符串时不检查边界,可能会造成内存泄露...
scanf_s和sizeof
08-27
- *1* [小结——scanfscanf_s的区别以及最近练习的一些习题](https://blog.csdn.net/weixin_72728720/article/details/126909714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm...
[学习记录]C Primer Plus(第6版)编程练习题 答案(带运行结果)——第5章
cooperlong的博客
08-03 402
C primer plus 第六版 第五章编程练习答案附带运行结果。零基础开始学这个书,学到哪儿做到哪儿。
团体程序设计天梯赛-练习集 (L2-021 - L2-040)
Obliviate的博客
04-22 3667
团体程序设计天梯赛-练习集 L2-021点赞狂魔、L2-022重排链表、L2-023图着色问题、L2-024部落、L2-025分而治之、L2-026小字辈、L2-027名人堂与代金券、L2-028秀恩爱分得快、L2-029特立独行的幸福、L2-031深入虎穴、L2-032彩虹瓶、L2-033简单计算器、L2-035完全二叉树的层序遍历、L2-036网红点打卡攻略、L2-037包装机、L2-038病毒溯源、L2-039清点代码库、L2-040哲哲打游戏
C语言基础内容(三)——第03章_运算符与流程控制
sun7_9的博客
01-08 1800
sizeof 运算符的返回值,C 语言只规定是无符号整数,并没有规定具体的类型,留给系统自己去决定sizeof 到底返回什么类型。不同的系统中,返回值的类型有可能是 unsigned int ,也有可能是unsigned long ,甚至是 unsigned long long ,对应的 printf() 占位符分别是 %u 、 %lu和 %llu。故建议不要轻易使用。头文件里面,对应当前系统的 sizeof 的返回值类型,可能是 unsigned int ,也可能是 unsigned long。
scanf() 与 scanf_s() 的区别
热门推荐
手指飞舞的专栏
01-26 5万+
scanf() 函数 :         scanf() 函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。         其调用格式为:scanf("",)。 scanf_s()函数:           scanf_s() 的功能虽然与scanf() 相同,但却比 scanf() 安全,因为 scanf_s() 是针对“ scanf()在读取字符串时不检查边界,可能会造
浅谈scanfscanf_s的区别,以及应对VS返回值被忽略的报错问题。
lsh0414的博客
12-11 8210
文章目录前言一、scanfscanf_s是什么?二、分别分析1.scanf2.scanf_s3其实scanfscanf_s在使用时只会在vs中有不同. 前言 随着IT行业的火爆,不少初学者出入编程,在使用VS和其他编译器对于scanfscanf_s的不同有疑问,下面文章有简单的
scanfscanf_s区别
m0_61721774的博客
12-11 1万+
最近有这么一篇作业,输入十个等长字符串并为其排序,本来是很简单的一道题,结果运行时却疯狂越界,百度了之后才知道是scanf的锅,于是决定查查其区别。 最大区别scanf()在读取数据时不检查边界,所以可能会造成内存访问越界;但scanf_s则避免了这个问题。举个例子。 #define _CRT_SECURE_NO_WARNINGS 1; #include<stdio.h> int main() { char k[5][4] = { 0 }; printf(...
scanfscanf_s的区别
你的调料包
11-28 3万+
自从用VisualStudio2015之后就不愿再去使用Visual C++6.0了,但是最近在学数据结构图时,总是在字符的连续输入遇到困惑. 使用VS都知道,要用scanf_s对键盘读入数据。 scanf("%c,%c",&amp;a,&amp;b);可以对字符连续输入; 如果是循环输入,在下添加getchar();这样一个语句吞噬掉输入时的回车即可; 但是同样用for(int i=0;...
scanfscanf_s的区别、解决VS返回值被忽略的报错问题
m0_68997646的博客
05-17 2403
scanfscanf_s的区别、解决VS返回值被忽略的报错问题
scanf()与scanf_s()的区别(C语言)
Mr____Cheng的博客
02-26 1933
简单区别scanf()不会检查输入边界,可能造成数据溢出。 scanf_s()是scanf()的安全版本,会检查输入边界。 例如: str[5] scanf("%s",str),如果输入abcdefgh,则会使fgh溢出进入其他地方,造成程序错误。 而scanf_s("%s",str),则只会接收前5个输入,其后的都无效,避免了程序的漏洞。 注意:vs2017已经不再使用scanf()...
scanf_s
weixin_30438813的博客
05-25 150
很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,有时hacker可以利用原版的不安全性黑掉系统 例如: ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存访问越界,例如分配了5字节的空间但是读入了10字节 char buf[5]={'\0'}; scanf("%s...
scanf()函数与scanf_s()函数的区别
晗生缘的博客
08-29 2282
scanf()函数与scanf_s()函数的区别scanf()函数是C语言中的一个输入函数,与printf()函数一样都被声明在stdio.h头文件中,它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。 scanf_s() 的功能虽然与scanf() 相同,但却比 scanf() 安全,因为 scanf_s() 是针对“ scanf()在读取字符串时不检查边界,可能会造成内存
c语言scanfscanf_s区别
10-11
scanfscanf_s是C语言中用于输入数据的函数,主要区别如下: 1. 安全性:scanf_s是scanf的安全版本,通过指定缓冲区的大小来防止缓冲区溢出。它要求提供缓冲区的大小作为第二个参数,以确保输入的数据不会超过缓冲区的大小。 2. 返回值:scanf_s在成功读取数据时返回成功读取的参数数量,而scanf在成功读取数据时返回成功读取的字符数量。这是一个细微的区别,但在一些情况下可能需要考虑。 3. 编译器支持:scanf是C89标准函数,而scanf_s是C11标准函数。因此,一些旧的编译器可能不支持scanf_s,而只支持scanf。 4. 跨平台性:由于不是所有平台都实现了C11标准,使用scanf_s可能导致代码在某些平台上无法编译或运行。为了更好地跨平台,一些开发人员仍然选择使用scanf
写文章

热门文章

  • 循环结构(几种语句) 3568
  • 基本数据类型 3217
  • 链表的特点,单链表的定义、存储结构,单链表的基本操作(判断链表是否为空、销毁链表、清空链表、求链表表长、查找、插入、删除,建立单链表) 2508
  • 输入输出一行字符串(应声虫) 2265
  • 小结——scanf和scanf_s的区别以及最近练习的一些习题 1662

分类专栏

  • 数据结构 15篇
  • C语言 10篇
  • 总结 1篇
  • Python 3篇
  • html 1篇
  • 离散数学 1篇

最新文章

  • 3~4矩阵的压缩存储(下)【详解】
  • 3~4矩阵的压缩存储【上】【详解】
  • 队列(数据结构)【详解】
2023年15篇
2022年19篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家淇滨玻璃钢雕塑费用东营卡通玻璃钢雕塑商场美陈新春商场大门美陈互动佛山玻璃钢桔子雕塑卢湾区商场组合玻璃钢花盆湖北高质量玻璃钢雕塑订做价格甘肃玻璃钢雕塑售价句容商场中秋美陈德州玻璃钢彩绘雕塑以花为主题的商场美陈保山玻璃钢雕塑批发商商场美陈招聘条件黑龙江个性化玻璃钢雕塑定做价格广东常见商场美陈订购苏州玻璃钢雕塑盐城商场玻璃钢花盆伊春玻璃钢雕塑公司山东玻璃钢卡通雕塑报价主题玻璃钢雕塑厂家现货建邺五一商场美陈蚌埠抽象玻璃钢雕塑多少钱玻璃钢发光雕塑粽子图片珠海时尚玻璃钢座椅雕塑玻璃钢广场车雕塑杭州美陈最好的商场西岗玻璃钢花盆花器临汾园林玻璃钢雕塑定制小区玻璃钢雕塑订制玻璃钢雕塑 修复香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化