C/C++种字符串的安全操作方式strcpy_s等字符串处理函数

来源:互联网 发布:转运物品 淘宝 编辑:程序博客网 时间:2024/06/07 09:06

C/C++种字符串的安全操作方式strcpy_s等字符串处理函数

这个错误可能比较隐蔽,虽然这个函数有说明。这个是我犯过的错,希望自己以后能够勉励,同时供大家参考免戒。

http://blog.sina.com.cn/s/blog_149e9d2ec0102wydr.html


我们在使用VS编写与字符处理相关的程序时,总是会出现一些提示,比如下面这个程序:
#include
#include
#include

int main()
{
    charsource[100] = "hello world!";
    chardest[101];
    strcpy(dest,source);
   printf("%s\n", dest);
    return0;
}

提示出错的原因如下:
1>------ 已启动生成:  项目: strsafe, 配置: Debug Win32------
1>  strsafe.cpp
1>d:\vsprogram\flip\strsafe\strsafe.cpp(9): error C4996:'strcpy': This function or variable may be unsafe. Consider usingstrcpy_s instead. To disable deprecation, use_CRT_SECURE_NO_WARNINGS. See online help for details.
1>         c:\program files (x86)\microsoft visual studio12.0\vc\include\string.h(112) : 参见“strcpy”的声明
========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个==========

上面一大堆,本质的意思就是说我们使用了不安全的字符串拷贝函数strcpy。如何解决这个问题呢
其实很简单,其中之一就是,进行宏定义,就是在程序的最前面添加这样一段宏,即可:
#define _CRT_SECURE_NO_WARNINGS

有人说,这么简单就搞定了。但是不要高兴太早了,因为这样只是治标不治本

我们都知道字符串处理函数都是不安全的,究其原因,不过是发生在拷贝的过程中。
比如我们把上面的那段代码稍微更改一下:
char source[] = "hello world!";
char dest[5];
strcpy(dest, source);
我们仅仅在定义时更改了:源字符串和目的字符串的大小。使得源字符串的长度大于目的字符串的长度。

那么这个才是我们今天要讲的主题,这样的话目的字符串就装不下整个源字符串,那么就会造成目的字符串中后面的数据破坏。但是最关键的是:函数并不知道自己已经破坏了内存,因为不知道所以不会向内存报错,因为没有报错,所以有时候我们就不知道怎么回事,程序哪里出现了问题。

那么如何解决这个问题呢?
我们可以使用对应字符串处理函数后面添加“_s”的方式解决这个问题。
比如最起初的程序,我们可以写成:
#include
#include
#include

int main()
{
    charsource[] = "hello world!";
    chardest[4];
   strcpy_s(dest, source);
   printf("%s\n", dest);
    return0;
}
这样的话,程序在执行的过程中就会知道目的字符串的空间小于源字符串的空间,那么就会提前终止程序,给出警告信息,


给出的错误信息就是:Buffer is too small。







原创粉丝点击