scanf和scanf_s、strcpy和strcpy_s、strncpy、gets

2024-05-08 22:38
文章标签 gets strcpy scanf strncpy

本文主要是介绍scanf和scanf_s、strcpy和strcpy_s、strncpy、gets,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在使用vs的时候,使用scanf和strcpy以及gets函数都会报错,说这几个函数存在安全问题。下面来看看到底会出现什么问题,以及安全的函数该如何写。
1、scanf和scanf_s
scanf在读取的时候不检查边界,可能造成内存访问越界,例如分配了5个字节的空间,但是读入了7个字节。

char str[5]={'\0'};
scanf("%s",str);
如果输入为7个字节1234567,那么后面的67都会被写到别的空间去。
#scanf_s("%s",str,5);
最多读取4个字节,最后一个参数表示缓冲区大小,表示最多读取多少个字节。

2、strcpy和strcpy_s
strcpy依据源字符串的’\0’作为结束标志的,不检查目标位置的大小,如果目标不够就会产生溢出问题。

char str[5];
strcpy(str,"hello world");
像这样就会产生溢出问题
strcpy_s(str,12,"hello world");
很奇怪的是打印出来的str居然是hello world,而且这么用在vs中也会出现错误,可以去试试。
第二个参数表示目标缓冲区大小,但又必须大于等于源字符串长度+1(结尾放'\0'),所以这个函数只能完全拷贝源串。要想部分拷贝只能用strncpy_s。

3、strncpy_s
这个函数可以部分拷贝。

char str[5];
strncpy_s(str,5,"hello world",4);
表示从源拷贝4个字节到5个字节的目标空间

4、gets
gets不检查字符串的大小,必须遇到换行符或文件结尾才会结束输入,容易造成缓存溢出的安全问题,可以用fgets代替。

char str[5];
fgets(str,6,stdin);
表示从键盘读入5个字符

这篇关于scanf和scanf_s、strcpy和strcpy_s、strncpy、gets的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971640

相关文章

HDU2523(论scanf的重要性)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2523 解题思路: 先把a数组排个序,然后把| xi - xj |的所有组合值求出来,把b数组在排个序。这时候要考虑出现1、1、1、2、2、3这种相邻两个一样的情况,开一个vis标记数组把相邻的数进行合并,这样就可以顺利取到第k大的值。 特别说明,论scanf和printf的重要性,用cin

ACM比赛中如何加速c++的输入输出?如何使cin速度与scanf速度相当?什么是最快的输入输出方法?

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中

c语言(scanf函数)

scanf函数注意事项: 1.输入字符 #include <stdio.h>int main(){char c;printf("请输入一个字符:\n");scanf("%c",&c);printf("输入的是%c\n",c);return 0;} 2.一次性输入多个数值,并且以某些符号隔开,应加以提示。( 注意:数值之间的分隔符是任意的,不一定要用中划线-,可以是逗号、空格、

strcpy复制一个字符串

看似很简单的题目,其实有着很多陷阱 首先看一个错误的范例: char  *r; strcpy(r,s); strcat(r,t); 错误在于:r并未指定地址且未赋予内存空间 好了,该如何做呢 首先,肯定得考虑内存的分配 使用malloc   显式调用分配内存 则也得显式调用释放内存free 不多说了 上代码 char *r; r=malloc(strlen(s)+strle

C语言gets()与scanf()

先列举几种情况,以下的代码只有输入方式有变化: 1. #include<string>#include<math.h>using namespace std;int main(){char m[33];char n[33];gets(n);gets(m);printf("%s",m);//正常输出return 0;} 2. #include<string>#include<math.

iOS笔记:第二篇 C语言scanf函数、变量和运算符

第一节  scanf函数 一、scanf函数的作用和语法 1>作用:可以在程序运行的时候让用户输入数据将用户输入的数据存储在变量起来。 2>语法:scanf("格式控制字符串",变量的地址列表);        二、scanf函数的用法 1、scanf函数是1个阻塞式的函数.当执行到这句代码的时候 CPU的执行会暂停,等着用户输入数据。数据输入完毕之后,才会继续往下执行。 2

hdu1014简单公式题(题目已经给出)0~MOD-1以及scanf的考察

/*题目意思:seed(x+1) = [seed(x) + STEP] % MOD 输入step和mod,按照公式,seed(x)从0开始,进行运算循环。当再次遇到0时,完成一次循环。 做题思路:累计一次循环中出现的个数,判断是否等于mod*/ #include<iostream>#include<cstdio>using namespace std;int main(){int

c memcpy 与 strcpy 区别

memcpy与strncpy区别     strncpy是把Num个字符从src复制到dest,但是如果遇到src字符结尾,那么复制提前结束,后面没有复制完的字符,不予以处理,当然dest,src地址不能重叠,     memcpy也是把Num个字符从src复制到dest,但是它是内存复制,不管是不是NULL,照样通吃

《C语言杂记》C语言使用gets函数出现的警告问题

首先我们来看个程序。 #include <stdio.h>#include <string.h>int main(int argc, char *argv[]){char s[100];printf("输入字符串:\n");gets(s); printf("%s\n",s); return 0;} 但是在编译的时候回出现如下警告。 main.c: In function ‘main’

poj 2886 Who Gets the Most Candies?

单点更新,还有凡素数表,所谓反素数, 对于任何正整数x,起约数的个数记做g(x).例如g(1)=1,g(6)=4. 定义:如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数. 现在给一个N,求出不超过N的最大的反素数. 比如:输入1000 输出 840 思维过程: 求[1..N]中最大的反素数-->求约数最多的数 如果求约数的个数