scanf和scanf_s函数详解

news/2024/12/19 23:22:35/

目录

引言:

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是一个字符串,用于指定输入的格式,而...表示可以接受任意数量的变量。

例:

#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函数的原型如下:

int scanf_s(const char *format, ...);

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

例:

#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.scanfscanf_s的区别:

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

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

 


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

结论:

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


http://www.ppmy.cn/news/1098973.html

相关文章

【vue3】一些关于hooks的使用经验

前言 最近接到了一个需求&#xff0c;隔壁嵌入式部门希望我们用前端解析渲染Kconfig表单。这篇文章用来记录一下本次使用hook pinia vue3的经验 hooks hooks的概念最早是在 React 中听到的&#xff0c;虽然早些时间也写过一点react&#xff0c;但也只是照葫芦画瓢&#xf…

cadence后仿真/寄生参数提取/解决pin口提取不全的问题

post-simulation设置顺序与规则 1.Rules 设置 2.inputs设置 3.outputs设置 4.PEX 设置 会出现错误1&#xff0c;后有解决方案 第一步 :Netlist 第二步&#xff1a;LVS 5.RUN PEX 先RUN&#xff0c;后按照图中1 2 3步骤操作 点击OK之后&#xff0c;显示Calibre信息&#xff…

Ztree的日常使用记录

1. 树节点名称中使用超文本标签 view.nameIsHTML设置为true即可 var setting {view: {nameIsHTML: true},check: {enable: true},data : {simpleData : {enable : true}} }; 2. 使用自定义的title显示 view.showTitle设置为true, 在data.key中声明title对应的字段名即可 …

这应该是最全的总结了!SQL中的开窗函数汇总!

目录 前言 窗口函数的格式 函数&#xff08;Function&#xff09;的类型 开窗函数over() 窗口函数使用 ROW_NUMBER() RANK()与DENSE_RANK() LEAD()与LAG() FIRST_VALUE()与LAST_VALUE() NTILE() MAX()、MIN()、AVG()、SUM()与COUNT() 窗口从句的使用 窗口从句进阶 …

【C++奇遇记】初探名称空间

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集 数据库专栏 初阶数据结构 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如…

存储概念|详解大小端存储

0.前言 1.数据的高位和低位 2.高地址和低地址 3.大端存储和小端存储 4.为什么会有大小端存储 5.验证C语言的数据的存储是大端还是小端 0.前言 大小端存储是计算机存储的一个设计概念&#xff0c;涉及了高地址和低地址&#xff0c;数据的高位和低位等概念&#xff0c;所以…

Delphi、C# 和 TypeScript 之父 Anders Hejlsberg(安德斯·海尔斯伯格,海神)赶潮AI

自2022年11月ChatGPT横空出世&#xff0c;一波由AIGC引发的热潮轰轰烈烈持续传播。 全球各国政府及大型互联网企业都在积极布局人工智能解决方案&#xff0c;抢占人工智能高地&#xff0c;推动人工智能产业健康发展。 Delphi、C# 和 TypeScript 之父&#xff0c;位列Microsof…

复制tr的一行数据或者复制数据使用,使用jq和php

效果图&#xff1a; 2.Html <!--复制的tr数据&#xff0c;s----------------------------------------------------------------------------------------------->{foreach from$arrs keykk itemvv} <tr><td style"text-align:center;" >1</t…