关闭

strcpy_s、sptintf_s与strcat_s的使用

标签: c++
955人阅读 评论(0) 收藏 举报
分类:

strcpy_s、sptintf_s与strcat_s是strcpy、sptintf与strcat的安全版本,均是通过指定缓冲区长度来避免存在的溢出风险。

strcpy_s 与strcpy

strcpy_s和strcpy函数的功能几乎是一样的。strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。在程序运行时,这将导致不可预料的行为。用strcpy_s就可以避免这些不可预料的行为。

这个函数用两个参数、三个参数都可以,只要可以保证缓冲区大小。
三个参数时:
                        errno_t strcpy_s(char *strDestination,size_t numberOfElements,const char *strSource);
两个参数时:
                       errno_t strcpy_s(char(&strDestination)[size],const char *strSource); // C++ only
例子:

#include<iostream>
#include<cstring>
using namespace std;

void Test(void)
{
	char *str1 = NULL;
	str1 = new char[20];
	char str[7];
	strcpy_s(str1, 20, "hello world");//三个参数
	strcpy_s(str, "hello");//两个参数但如果:char *str=new char[7];会出错:提示不支持两个参数
	cout << "strlen(str1):" << strlen(str1) << endl << "strlen(str):" << strlen(str) << endl;
	printf(str1);
	printf("\n");
	cout << str << endl;
}

int main()
{
	Test();
	return 0;
}
结果:

strlen(str1):11
strlen(str):5
hello world
hello
请按任意键继续. . .

sptintf_s与sptintf

sprintf
定义:
int sprintf( char *buffer, const char *format [, argument] ... );
常见用法

//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
可以指定宽度,不足的左边补空格:
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
当然也可以左对齐:
sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"
也可以按照16 进制打印:
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐


sprintf_s
int sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format [, argument] ... );

#include<iostream>
#include<cstring>
using namespace std;


int main()
{
	char filename[1024];//需要预先分配缓冲区
	char path1[128] = "D:\\Program\\Tesseract-OCR\\tesseract.exe";
	char path2[128] = "D:\\Program\\Tesseract-OCR\\";
	char path3[128] = "D:\\Program\\Tesseract-OCR\\txt";
	char path4[128] = "-l chi_sim";
	sprintf_s(filename,sizeof(filename), "%s %s %s %s", path1, path2, path3, path4);
	cout << filename;
	return 0;
}

strcat_s与strcat

        原形:

              errno_t strcat_s(char *strDestination,size_t numberOfElements,constchar *strSource);
                extern char *strcat(char *dest,char *src);

strDestination要为strSource留下足够的内存,具体为:

假设strDestination为一个数组的话,

sizeof(strDestination)>=sizeof(strSource)+strlen(strDestination);

numberOfElements=sizeof(strDestination)

举例说明二者的区别:

char szBuf[3] = {0};
       strcat_s(szBuf, 3, "kdfdfj"); // 第一种连接字符串方法
       strcat(szBuf, "kdfdfj"); // 第二种连接字符串方法
      对于这两个例句,你仔细看就会发现他们有缓冲区溢出的问题.
        而用第一个函数则不同,它会抛出一个异常。
         但使用第二个函数的结果则不能确定,因为它可能会错误地改变了程序中其他部分的内存的数据,有可能不会抛出异常,但         会导致程序数据错误,也可能由于非法内存访问抛出异常
使用规范:
  char string[20]="123";
  strcat_s(string,sizeof(string),"456");
  printf("%s",string);这样20个元素,足够装下123456了。
注:以上三个安全函数取缓冲大小numberOfElements时,都可以取成前面那个strDestination的字节大小。
另外我们要注意strDestination到底是指针还是数组,注意二者sizeof的区别,可以混上strlen一起使用。
参考例子:《自定义String
 





0
1
查看评论

strcpy_s 和 strcat_s的用法

strcpy_s是系统的安全函数,微软在2005后建议用一系统所谓安全的函数,这中间就有strcpy_s取代了strcpy,原来strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。所以用strcpy_s代替,下面有一个使用strcp...
  • Tianyu_Wang
  • Tianyu_Wang
  • 2014-03-30 11:48
  • 14870

使用strcat_s的注意事项

我们要合并字符串的话,使用c语言编写的时候需要注意几点事项。     strcat_s函数声明: errno_t strcat_s( char *strDestination, size_t numberOfElements, const char *strS...
  • xiaobin_HLJ80
  • xiaobin_HLJ80
  • 2014-02-28 15:35
  • 10486

strcpy_s、sptintf_s与strcat_s的使用

strcpy_s、sptintf_s与strcat_s是strcpy、sptintf与strcat的安全版本,均是通过指定缓冲区长度来避免存在的溢出风险。 strcpy_s 与strcpy strcpy_s和strcpy函数的功能几乎是一样的。strcpy函数,就象gets函数一样,它没有方法来...
  • xiamentingtao
  • xiamentingtao
  • 2015-11-19 12:12
  • 955

C++安全函数之strcat_s

C++安全函数之strcat_s 1.必须包含的头文件: 2.函数申明: errno_t strcat_s( char *strDestination, size_t numberOfElements, const char *strSource );3.参数介绍 str...
  • wxm349810930
  • wxm349810930
  • 2016-09-16 09:31
  • 2403

strcat_s 和 strcat 的区别

他们的作用我不说你也知道是吧。对于他们的区别,stract_s是VS2005及以后新增的具有更强"安全性"的CRT函数。这个安全性如何理解:如:char szBuf[3]={0};1> strcat_s(szBuf,3,"kdfdfj");2> s...
  • mkhgg
  • mkhgg
  • 2011-03-22 11:15
  • 847

C++笔记 strcat_s和strcat的区别

strcat_s在C/C++中,用于连接两个字符串的标准库函数,是strcat函数的增强版本。 需包含的预编译头文件 编辑 1、在C语言中:#include 2、在C++语言中:#include (可配合使用 using namespace std; 语句) ...
  • qq_27605099
  • qq_27605099
  • 2016-12-02 19:08
  • 2089

strcat_s参数、文件属性

一、strcat_s第二个参数的真实意义:         用习惯了其它类似的安全字符串函数,总想当然的以为第二个参数也表示目的buffer的可用空间大小。其实它指的是目的缓存整个空间的大小!如果把这个意思理解反了,很容易导致程...
  • vcPlayer
  • vcPlayer
  • 2013-08-07 23:20
  • 2512

strcpy_s 和 strcat_s的用法

本文为转载,原博客地址:http://blog.csdn.net/geekvc/article/details/22578215 strcpy_s是系统的安全函数,微软在2005后建议用一系统所谓安全的函数,这中间就有strcpy_s取代了strcpy,原来strcpy函数,就象g...
  • wgx571859177
  • wgx571859177
  • 2018-01-03 20:56
  • 58

strcpy_s 和 strcat_s的用法

strcpy_s 和 strcat_s的用法   strcpy_s是系统的安全函数,微软在2005后建议用一系统所谓安全的函数,这中 间就有strcpy_s取代了strcpy,原来strcpy函数,就象gets函数一样,它没有方法 来保证有效的缓冲区尺寸,所以它只能假定缓冲足够...
  • yyylll62803112
  • yyylll62803112
  • 2014-03-26 16:49
  • 1175

strcpy_s、strcat_s的用法

一、strcpy_s的用法 1、strcpy_s的定义 errno_t strcpy_s(char *strDestination, size_t numberOfElements, const char *strSource); 2、strcpy_s参数的含义 strDestination ...
  • bladeandmaster88
  • bladeandmaster88
  • 2016-11-23 20:37
  • 390
    个人资料
    • 访问:308783次
    • 积分:4349
    • 等级:
    • 排名:第8264名
    • 原创:118篇
    • 转载:82篇
    • 译文:8篇
    • 评论:107条
    个人网站
    最新评论