strlen获取char*的大小问题

遇到需要获取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。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值