写了个函数,用于截取位置X到位置Y长度的字符串 代码如下
第一个函数是输入函数,第二个函数表示X的位置,第三个函数表示Y的位置,第四个函数是输出函数,即截获的字符串
UINT CTimerDlg::SubString(LPCWSTR pStr, UINT uBegin, UINT uEnd, WCHAR *pOutStr)
{
if (uBegin > uEnd)
return SSERR_BGTE;
if (pStr == NULL || uBegin == 0 || uEnd == 0)
return SSERR_INNULL;
LPWSTR pBuf = new CHAR[uEnd-uBegin+2]; 加2是因为本身uEnd-uBegin少1位,需要加1,另外加1是能让字符串有空结束符
UINT n = 0;
UINT i = 0;
for (i = uBegin; i < uEnd; i++)
{
pBuf[n] = pStr[i];
n++;
};
int ilen = wcslen(pBuf);
wcscpy_s(pOutStr, (uEnd-uBegin+2), pBuf);
return SSERR_OK;
}
问题就在LPWSTR pBuf = new CHAR[uEnd-uBegin+2]这行代码上 比方说我要截取的开始位置是第3位,结束位置为第8位,那我这里给pBuf分配了[8-3+2]为7位,但是调试运行时,系统自动为我分配了14位,我知道WCHAR 占2个字节 14位没错。但运行到wcscpy_s(pOutStr, (uEnd-uBegin+2), pBuf);这里就出错了,我在调试窗口可以看到pBuf的内容为"123456???????"(后面很多个“?”) 明显多了“?”的字节数。请问改怎么解决?
第一个函数是输入函数,第二个函数表示X的位置,第三个函数表示Y的位置,第四个函数是输出函数,即截获的字符串
UINT CTimerDlg::SubString(LPCWSTR pStr, UINT uBegin, UINT uEnd, WCHAR *pOutStr)
{
if (uBegin > uEnd)
return SSERR_BGTE;
if (pStr == NULL || uBegin == 0 || uEnd == 0)
return SSERR_INNULL;
LPWSTR pBuf = new CHAR[uEnd-uBegin+2]; 加2是因为本身uEnd-uBegin少1位,需要加1,另外加1是能让字符串有空结束符
UINT n = 0;
UINT i = 0;
for (i = uBegin; i < uEnd; i++)
{
pBuf[n] = pStr[i];
n++;
};
int ilen = wcslen(pBuf);
wcscpy_s(pOutStr, (uEnd-uBegin+2), pBuf);
return SSERR_OK;
}
问题就在LPWSTR pBuf = new CHAR[uEnd-uBegin+2]这行代码上 比方说我要截取的开始位置是第3位,结束位置为第8位,那我这里给pBuf分配了[8-3+2]为7位,但是调试运行时,系统自动为我分配了14位,我知道WCHAR 占2个字节 14位没错。但运行到wcscpy_s(pOutStr, (uEnd-uBegin+2), pBuf);这里就出错了,我在调试窗口可以看到pBuf的内容为"123456???????"(后面很多个“?”) 明显多了“?”的字节数。请问改怎么解决?