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。
strlen获取char*的大小问题相关推荐
- c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏
void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmove(void *d ...
- c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏!...
前方干货准备!!! void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmo ...
- java如何获取一个对象的大小
Refrence https://cloud.tencent.com/developer/article/1060294 什么时候需要知道对象的内存大小 在内存足够用的情况下我们是不需要考虑java中 ...
- Qt通过QStorageInfo获取磁盘大小,linux下可根据路径获取挂接磁盘的大小,而非获取所有磁盘大小的总和
QStorageInfo类提供了系统当前挂载的存储和驱动器的相关信息,包括它们的空间,挂载点,标签名,文件系统名. 可以创建一个QStorageInfo对象,使用其静态方法mountedVolumes ...
- python获取文件的大小_python获取文件大小
python获取文件大小# !/usr/bin/python3.4 # -*- coding: utf-8 -*- import os # 字节bytes转化kb\m\g def formatSize ...
- Xamarin.Forms获取设备屏幕大小
Xamarin.Forms获取设备屏幕大小 可以借助device.Display获取.基本形式如下: var display = device.Display; 然后就可以获取屏幕大小. displa ...
- JS获取当前对象大小以及屏幕分辨率等...
<!DOCTYPE html> <html> <head><meta charset="utf-8"/><meta name= ...
- Android杂谈---获取手机屏幕大小
Android杂谈---获取手机屏幕大小 SurfaceView简单例子 玩转Android---UI篇---ZoomControls放大缩小图片 更多相关推荐 这里总结下android中关于手机屏幕 ...
- [转]JS获取当前对象大小以及屏幕分辨率等
http://www.cnblogs.com/tearer/archive/2010/09/06/1819471.html JS获取当前对象大小以及屏幕分辨率等 Code highlighting p ...
最新文章
- php按比例截图,php 按比例生成小图函数
- 【数字信号处理】离散时间系统因果性 ( 因果性概念 | 充要条件及证明 )
- 你到底有几个邮箱?码云账号增加多邮箱支持!
- python 异常函数调用栈_Python捕获异常堆栈信息的几种方法
- BZOJ3262: 陌上花开(cdq分治)
- sockaddr与sockaddr_in的区别
- Keil 5中精简器件支持包,手动安装pack包
- zabbix邮件通知,短信通知配置详解
- .NET中Redis安装部署及使用方法简介附-开源Redis操作辅助类
- 对int array进行排序
- WIN2003 IIS6.0+PHP+ASP+MYSQL优化配置
- 如何将小工具添加回Windows 8和10(以及为什么您不应该这样做)
- 从零开始的JAVA反序列化漏洞学习(一)
- IE浏览器无法连接网络的解决办法
- Squid代理服务器应用及配置(图文详解)
- 原码、反码、补码和真值
- 数据结构之树从入门到如土(四)----从零开始入门Rust实现一颗B树(未完成待续)
- C++后端开发面试题精选
- 盖世帝尊 I 分享(一叶青天)
- 如何利用OA优化企业的采购招投标流程