MFC 字符串拷贝越界问题

xiaoxiao2021-02-28  53

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的就是字符数组,字符串不会乱码,字符数组只有前面长度的值正确,超出长度的会显示乱码

转载请注明原文地址: https://www.6miu.com/read-2600249.html

最新回复(0)