字符串拷贝函数使用注意事项

本文针对Windows平台下的C/C++编程,介绍了使用字符串操作函数时应注意的安全事项,对比了wcscpy、strcpy等函数与安全替代函数wcsncpy_s、_tcsncpy_s的区别,并通过实例演示了不当使用可能导致的问题。

                            温辉敏(wenhm@sina.com)  2008-7-30

摘要:本文简单介绍了Windows平台下CC++编程时,字符串操作函数的一些注意事项。

作者博客:http://blog.csdn.net/wenhm/

 

看到大家在代码中有很多用wcscpystrcpy等的,这里总结下给大家参考下,希望对大家有帮助(这里的API都是windows平台下的,linux下的应该也有类似的替换函数):

l          _tcscpy_tcscpy_s 都是不安全的,换成_tcsncpy /_tcsncpy_s好些,最好用_tcsncpy_s

l          wcscpywcscpy_s都是不安全的,换成wcsncpy / wcsncpy_s好些,最好用wcsncpy_s

unicode 函数类似,linux版本类似。

下面是一些会导致出错的代码,直接都可以运行的,有兴趣的可以试试。

 

#define PARRAYSIZE(array) ((sizeof(array)/sizeof(array[0])))

 

void CWindowsApiTest::testwcscpy()

{

     WCHAR strBuf1[] = L"你是一个好人!你是一个好人!";

     WCHAR strBuf2[10] = {0};

     wcscpy(strBuf2, strBuf1);

 

     int iStrLen = wcslen(strBuf2);

     bool bResult = (iStrLen <= 10);

 

     CPPUNIT_ASSERT_EQUAL_MESSAGE("内存越界了!iStrLen变成14.", bResult, true);

}

 

void CWindowsApiTest::testwcscpy_s()

{

     WCHAR strBuf1[] = L"你是一个好人!你是一个好人!";

     WCHAR strBuf2[10] = {0};

     wcscpy_s(strBuf2, 10, strBuf1);

 

     int iStrLen = wcslen(strBuf2);

     bool bResult = (iStrLen <= 10);

 

     CPPUNIT_ASSERT_EQUAL_MESSAGE("内存越界了!但是Debug版本会提示用户越界", bResult, true);

}

 

void CWindowsApiTest::testwcsncpy()

{

     WCHAR strBuf1[] = L"你是一个好人!你是一个好人!";

     WCHAR strBuf2[10] = {0};

     wcsncpy(strBuf2, strBuf1, PARRAYSIZE(strBuf2));

 

     int iStrLen = wcslen(strBuf2);

     bool bResult = (iStrLen <= 10);

 

     CPPUNIT_ASSERT_EQUAL_MESSAGE("内存越界了!没有地方放置结束符,iStrLen:28,正确用法:wcsncpy(strBuf2, strBuf1, PARRAYSIZE(strBuf2)-1);", bResult, true);

}

 

void CWindowsApiTest::testwcsncpy_s()

{

     WCHAR strBuf1[] = L"你是一个好人!你是一个好人!";

     WCHAR strBuf2[10] = {0};

     wcsncpy_s(strBuf2, PARRAYSIZE(strBuf2), strBuf1, PARRAYSIZE(strBuf2) );

 

     int iStrLen = wcslen(strBuf2);

     bool bResult = (iStrLen <= 10);

 

     CPPUNIT_ASSERT_EQUAL_MESSAGE("内存越界了!正确用法:wcsncpy_s(strBuf2, PARRAYSIZE(strBuf2), strBuf1, PARRAYSIZE(strBuf2) - 1);", bResult, true);

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值