C语言中scanf与scanf_s函数的使用详解

 更新时间:2021年10月18日 09:56:21   作者:许同学。。  
本文主要介绍了C语言中scanf与scanf_s函数的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1.scanf_s(是vs提供的函数)

a.代码1

int main()
{
	char a = 0;
	//scanf_s("%c", &a, 1);
	scanf_s("%c", &a, sizeof(a));
	return 0;
}

scanf_s有三个参数,最后一个是变量a所占据空间的大小(单位为字节),这里可以写1,也可以写sizeof(a)。如果a为整型的话,第三个参数就为4,或者sizeof(a)。

b.代码2

int main()
{
	char a = 0, b = 0;
	scanf_s("%c %c", &a, 1, &b, 1);
	printf("%c %c", a, b);
	return 0;
}

可不要写成  scanf_s("%c%c",&a,&b,1,1); 这样会出错的

c.代码3

int main()
{
	char arr1[5] = { 0 };
	scanf_s("%s", arr1, sizeof(arr1));
	printf("%s", arr1);
	return 0;
}

注意:输入字符的个数时,一定是比数组的空间个数小的,比如像上面的代码只能输入1-4个字符,而不是5个,不然会出错的。(arr[4]装的应该是一个换行符)

d.安全性检测

int main()
{
	char arr1[5] = { 0 };
	int c=scanf_s("%s", arr1, sizeof(arr1));
	printf("%d\n", c);
	printf("%s", arr1);
	return 0;
}

如果输入的字符个数>=数组空间 个数,scanf_s的返回值就为0,反之则为1。

int main()
{
	char arr1[5] = { 0 };
	scanf_s("%s", arr1, sizeof(arr1));
	printf("%s", arr1);
	return 0;
}

 如果输入的字符个数>=数组空间 个数,是不会打印数组中的元素的。(而scanf函数就会打印出)

2.scanf(标准的库函数)

a.代码1

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	printf("%d", a);
	return 0;
}

在VS13 17 19的版本下使用scanf函数一定在最开始(#define _CRT_SECURE_NO_WARNINGS),不然会报错的。

b.安全性测试

int main()
{
	char arr1[5] = { 0 };
	int c=scanf("%s", arr1);
	printf("%d\n", c);
	printf("%s", arr1);
	return 0;
}

 当我们输入abcdefg 7个字符时(已经超出了数组的空间个数了),虽然可以打印出来,但是arr1附近的栈空间已被破坏了,出现越界的情况了。scanf_s不会打印出来,也就不存在越界的行为了。

c.当在scanf函数里面输入格式符

如%d %d(%d%d之间有空格),那么通过标准输入设备(键盘)输入时两个整型之间也加一个空格。

如%d,%d(%d%d之间逗号),那么通过标准输入设备(键盘)输入时两个整型之间也加一个逗号。

3.总结

使用scanf_s函数虽然安全性比较高,但是可移植性差。比如含有scanf_s函数的代码不一定在其它的编译器上能够跑过。

scanf函数虽然没有scanf_s函数那么安全,但可移植性是比scanf_s强。

scanf_s函数与scanf函数的使用与比较今天就分享到这里了,如果对你有帮助的话吗,可以给个关注,顺便给个赞。

到此这篇关于C语言中scanf与scanf_s函数的使用详解的文章就介绍到这了,更多相关C语言 scanf与scanf_s内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单谈谈C++ 中指针与引用

    简单谈谈C++ 中指针与引用

    下面用通俗易懂的话来概述一下,指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。
    2015-09-09
  • 在c和c++中实现函数回调

    在c和c++中实现函数回调

    如何在c和c++中实现函数回调呢?现在小编就和大家分享一下在c/c++中实现函数回调的示例代码,需要的朋友可以参考下
    2013-07-07
  • C语言矩阵连乘 (动态规划)详解

    C语言矩阵连乘 (动态规划)详解

    这篇文章主要介绍了C语言矩阵连乘 (动态规划)详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • C语言模拟实现通讯录程序过程

    C语言模拟实现通讯录程序过程

    这篇文章主要介绍了C语言模拟实现通讯录程序过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • C语言菜鸟基础教程之Hello World

    C语言菜鸟基础教程之Hello World

    C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
    2017-10-10
  • zlib库压缩和解压字符串STL string的实例详解

    zlib库压缩和解压字符串STL string的实例详解

    这篇文章主要介绍了zlib库压缩和解压字符串STL string的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • C++函数中return语句的使用方法

    C++函数中return语句的使用方法

    C++中的return语句是函数中一个重要的语句,return语句用于结束当前正在执行的函数,并将控制权返回给调用此函数的函数,需要的朋友可以了解下
    2012-12-12
  • C++ STL之list双向链表容器方式

    C++ STL之list双向链表容器方式

    这篇文章主要介绍了C++ STL之list双向链表容器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • wxWidgets自定义按钮的方法

    wxWidgets自定义按钮的方法

    这篇文章主要为大家详细介绍了wxWidgets自定义按钮的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C++ 通过pqxxlib库链接 PostgreSql数据库的详细过程

    C++ 通过pqxxlib库链接 PostgreSql数据库的详细过程

    这篇文章主要介绍了C++ 通过pqxxlib库链接 PostgreSql数据库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04

最新评论