strlen获取char*的大小问题

xiaoxiao2021-02-28  96

遇到需要获取Char*类型字符串的大小时,使用strlen发现获取的大小比new这个char*时候的大小要大。

代码如下:

HANDLE hfile = CreateFile(str1, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL); if(hfile == INVALID_HANDLE_VALUE) { AfxMessageBox("加载文本失败!"); return ; } DWORD dwsize = GetFileSize(hfile, NULL); char *pDataBuf = new char[dwsize]; DWORD dwread = 0; ReadFile(hfile, pDataBuf, dwsize, &dwread, NULL); char da = pDataBuf[dwsize]; int i = strlen(pDataBuf); //base64加密 char *pOutBuf; pOutBuf = base64_encode(pDataBuf,dwsize); delete []pDataBuf; CloseHandle(hfile); 用strlen获取的pDataBuf的大小比dwsize大4。

strlen的用法:

 int strlen(const char *str)   {   assert(str != NULL);   int len = 0;   while((*str++) != '/0')   len++;   return len;   }

可以看出strlen是查找字符串中的“\0”,即结束符。在原始代码中pDataBuf中所有字节都被写入数据,strlen在查找的时候并不会找到“\0”,所以不会获得准确的字符串长度。可以在申请pDataBuf的大小的时候多申请一个字节,然后将最后一个字节的值设置为“\0”。修改后的代码如下

HANDLE hfile = CreateFile(str1, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL); if(hfile == INVALID_HANDLE_VALUE) { AfxMessageBox("加载文本失败!"); return ; } DWORD dwsize = GetFileSize(hfile, NULL); char *pDataBuf = new char[dwsize+1]; memset(pDataBuf, '\0', dwsize+1); DWORD dwread = 0; ReadFile(hfile, pDataBuf, dwsize, &dwread, NULL); char da = pDataBuf[dwsize]; int i = strlen(pDataBuf); //base64加密 char *pOutBuf; pOutBuf = base64_encode(pDataBuf,dwsize); delete []pDataBuf; CloseHandle(hfile);此时获取的pDataBuf的大小就等于dwsize。

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

最新回复(0)