MFC 字符串拷贝越界问题

1.strcpy与strcpy_s

越界条件:当接收内容时,如果用一个小的buf进行接收,就会发生越界,导致程序崩溃

说明:这两个函数的功能是一样的,唯一的区别是在越界的时候,strcpy不好定位,而strcpy_s直接就会定位到代码位置,方便定位


2.防止字符串拷贝越界的方法

例子:

CString strName(_T("BBBBBCCCCCBBBBBCCCCCBBBBBCCCCCBBBBBCCCCCBBBBBCCCCCBBBBBCCCCCQQQQ"));

现在用一个buf来接收上面的内容,

(1)接收buf大小自己任意设置,正常的代码如下:

         int nLen = strName.GetLength();
         char *pTmp = new char[nLen + 1];
         strcpy_s(pTmp, nLen + 1, CW2A(strName));
         delete [] pTmp;

(2)取 strName的前15个字符,代码如下

	int nLen = 15;
	CString strTmp = strName.Left(nLen);
	char *pTmp = new char[nLen + 1];
	strcpy_s(pTmp, nLen + 1, CW2A(strTmp));
	delete [] pTmp;

错误代码:

	int nLen = 15;
	char *pTmp = new char[nLen + 1];
	strcpy_s(pTmp, nLen + 1, CW2A(strName));
	pTmp[nLen+1] = '0';
	delete [] pTmp;
错误:(1)strcpy_s处pTmp大小仍然比CW2A(strName)小  (2)pTmp没有pTmp[nLen+1],最大是pTmp[nLen]


(3)固定的buf接收

接收成字符串使用:

#define LEN 32
	char abyTmp[LEN] = {0};
	CString strTMp;
	int nle = strName.GetLength();
	if (nle >= LEN)
	{
		strTMp = strName.Left(LEN - 1);
	}
	else
	{
		strTMp = strName;
	}
	strcpy_s(abyTmp, LEN, CW2A(strTMp));
结果是:最后一个字符是0,用于显示


接收成字符数组使用:

#define LEN 32
	char abyTmp[LEN] = {0};
	CString strTMp;
	int nle = strName.GetLength();
	if (nle >= LEN)
	{
		strTMp = strName.Left(LEN );
	}
	else
	{
		strTMp = strName;
	}
	memcpy_s(abyTmp, LEN, CW2A(strName), LEN);
 
 
结果是:最后一个字符是具体值,因为不是字符串,所以只能用作数据传输等使用,如果显示会发现后面的是乱码

 
 

 
 

注意:

总结:字符串拷贝时,要保证用来接收的buf的长度“大于或等于“源内容的长度,这里的长度是字节数


附:字符串与字符数组,如char a[5],把最后字符以0结尾的叫字符串,不是0的就是字符数组,字符串不会乱码,字符数组只有前面长度的值正确,超出长度的会显示乱码



猜你喜欢

转载自blog.csdn.net/wangkui1331/article/details/79569282
MFC
今日推荐