遇到需要获取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*的大小问题相关推荐

  1. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏

    void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmove(void *d ...

  2. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏!...

    前方干货准备!!! void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmo ...

  3. java如何获取一个对象的大小

    Refrence https://cloud.tencent.com/developer/article/1060294 什么时候需要知道对象的内存大小 在内存足够用的情况下我们是不需要考虑java中 ...

  4. Qt通过QStorageInfo获取磁盘大小,linux下可根据路径获取挂接磁盘的大小,而非获取所有磁盘大小的总和

    QStorageInfo类提供了系统当前挂载的存储和驱动器的相关信息,包括它们的空间,挂载点,标签名,文件系统名. 可以创建一个QStorageInfo对象,使用其静态方法mountedVolumes ...

  5. python获取文件的大小_python获取文件大小

    python获取文件大小# !/usr/bin/python3.4 # -*- coding: utf-8 -*- import os # 字节bytes转化kb\m\g def formatSize ...

  6. Xamarin.Forms获取设备屏幕大小

    Xamarin.Forms获取设备屏幕大小 可以借助device.Display获取.基本形式如下: var display = device.Display; 然后就可以获取屏幕大小. displa ...

  7. JS获取当前对象大小以及屏幕分辨率等...

    <!DOCTYPE html> <html> <head><meta charset="utf-8"/><meta name= ...

  8. Android杂谈---获取手机屏幕大小

    Android杂谈---获取手机屏幕大小 SurfaceView简单例子 玩转Android---UI篇---ZoomControls放大缩小图片 更多相关推荐 这里总结下android中关于手机屏幕 ...

  9. [转]JS获取当前对象大小以及屏幕分辨率等

    http://www.cnblogs.com/tearer/archive/2010/09/06/1819471.html JS获取当前对象大小以及屏幕分辨率等 Code highlighting p ...

最新文章

  1. php按比例截图,php 按比例生成小图函数
  2. 【数字信号处理】离散时间系统因果性 ( 因果性概念 | 充要条件及证明 )
  3. 你到底有几个邮箱?码云账号增加多邮箱支持!
  4. python 异常函数调用栈_Python捕获异常堆栈信息的几种方法
  5. BZOJ3262: 陌上花开(cdq分治)
  6. sockaddr与sockaddr_in的区别
  7. Keil 5中精简器件支持包,手动安装pack包
  8. zabbix邮件通知,短信通知配置详解
  9. .NET中Redis安装部署及使用方法简介附-开源Redis操作辅助类
  10. 对int array进行排序
  11. WIN2003 IIS6.0+PHP+ASP+MYSQL优化配置
  12. 如何将小工具添加回Windows 8和10(以及为什么您不应该这样做)
  13. 从零开始的JAVA反序列化漏洞学习(一)
  14. IE浏览器无法连接网络的解决办法
  15. Squid代理服务器应用及配置(图文详解)
  16. 原码、反码、补码和真值
  17. 数据结构之树从入门到如土(四)----从零开始入门Rust实现一颗B树(未完成待续)
  18. C++后端开发面试题精选
  19. 盖世帝尊 I 分享(一叶青天)
  20. 如何利用OA优化企业的采购招投标流程

热门文章

  1. python并发编程-进程池线程池-协程-I/O模型-04
  2. Jmeter书中不会教你的(7)——prev变量用于输出请求和响应内容
  3. 2016届蓝桥杯省赛B组 第5题 勾股定理
  4. [ZT]JavaScript+div实现模态对话框[修正版]
  5. C++二维数组初始化的形式
  6. 为什么任正非“反对”自主创新?
  7. 国产信息化自主创新行业简介
  8. 雪亮工程 视频分类总结
  9. Mendeley从标签找到pdf后,文件打不开怎么办
  10. 模仿Airbnb的悬浮搜索框动画