谈新手对CString的使用

标准C++实现字符串类CString // String.cpp: implementation of the CString class. // ////////////////////////////////////////////////////////////////////// #include "String.h" #include #include #include #include #inclu 阅读详情
CString类功能强大,比STL的string类有过之无不及.新手使用CString时,都会被它强大
的功能所吸引.然而由于对它内部机制的不了解,新手在将CString向C的字符数组转换时
容易出现很多问题.因为CString已经重载了LPCTSTR运算符,所以CString类向const
char *转换时没有什么麻烦,如下所示:
char a[100];
CString str("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));
或者如下:
strncpy(a,str,sizeof(a));
以上两种用法都是正确地.因为strncpy的第二个参数类型为const char *.所以编译器
会自动将CString类转换成const char *.很多人对LPCTSTR是什么东西迷惑不解,让我们
来看看:
1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别
的,都是32位.所以这里的LP和P是等价的.
2.C表示const
3.T是什么东西呢,我们知道TCHAR在采用UNICODE方式编译时是wchar_t,在普通时编译成char
那么就可以看出LPCTSTR(PCTSTR)在UINCODE时是const wchar_t *,PCWSTR,LPCWSTR,在
多字节字符模式时是const char *,PCSTR,LPCSTR.
接下来我们看在非UNICODE情况下,怎样将CString转换成char *,很多初学者都为了方便
采用如下方法:
(char *)(LPCSTR)str.这样对吗?我们首先来看一个例子:
 CString str("aa");
strcpy((char *)(LPCTSTR)str,"aaaaaaaa");
 cout<<(LPCTSTR)str<<endl;
在Debug下运行出现了异常,我们都知道CString类内部有自己的字符指针,指向一个已分
配的字符缓冲区.如果往里面写的字符数超出了缓冲区范围,当然会出现异常.但这个程
序在Release版本下不会出现问题.原来对CString类已经进行了优化.当需要分配的内存
小于64字节时,直接分配64字节的内存,以此类推,一般CString类字符缓冲区的大小为
64,128,256,512...这样是为了减少内存分配的次数,提高速度.
那有人就说我往里面写的字符数不超过它原来的字符数,不就不会出错了,比如
CString str("aaaaaaa");
strcpy((char *)(LPCTSTR)str,"aa");
cout<<(LPCTSTR)str<<endl;
这样看起来是没什么问题.我们再来看下面这个例子:
CString str("aaaaaaa");
strcpy((char *)(LPCTSTR)str,"aa");
cout<<(LPCTSTR)str<<endl;
cout<<str.GetLength()<<endl;
我们看到str的长度没有随之改变,继续为7而不是2.还有更严重的问题:
 CString str("aaaaaaa");
 CString str1 = str;
 strcpy((char *)(LPCTSTR)str,"aa");
 cout<<(LPCTSTR)str<<endl;
 cout<<(LPCTSTR)str1<<endl;
按说我们只改变了str,str1应该没有改变呀,可是事实时他们都变成了"aa".难道str和
str1里面的字符指针指向的缓冲区是一个.我们在Effective C++里面得知,如果你的类
内部有包含指针,请为你的类写一个拷贝构造函数和赋值运算符.不要让两个对象内部的
指针指向同一区域,而应该重新分配内存.难道是微软犯了错?
原来这里还有一个"写时复制"和"引用计数"的概念.CString类的用途很广,这样有可能
在系统内部产生大量的CString临时对象.这时为了优化效率,就采用在系统软件内部广
泛使用的"写时复制"概念.即当从一个CString产生另一个CString并不复制它的字符缓
冲区内容,而只是将字符缓冲区的"引用计数"加1.当需要改写字符缓冲区内的内容时,才
分配内存,并复制内容.以后我会给出一个"写时复制"和"引用计数"的例子
我们回到主题上来,当我们需要将CString转换成char *时,我们应该怎么做呢?其时只是
麻烦一点,如下所示:
CString str("aaaaaaa");
strcpy(str.GetBuffer(10),"aa");
str.ReleaseBuffer();
当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使
用完成后一定要马上调用ReleaseBuffer();
还有很重要的一点就是,在能使用const char *的地方,就不要使用char *
C++调用字符串库函数cstring的常见操作和实现 字符串库cstring的常见操作 // 字符串拷贝 // strcpy (char dest [],char src []); // 拷贝 src 到dest // 字符串比较大小 // int strcmp (char s1[],s2[]); // 返回 0则相等 // 求字符串长度 // int strlen (char s[]); // 不算结尾的 '\0' // 字符串 拼接 // strcat (char s1[],s2[]); //s2 拼接到 s1 后面 // 字符串转成大写 // stru 阅读详情

相关推荐

C++实现自定义字符串类CString

在C++编程中,字符串是一种常见的数据类型。标准库中提供了string类来处理字符串,但是有时候我们可能需要自定义一个字符串类来满足特定的需求。在本文中,我将展示如何使用标准C++实现一个简单的自定义字符串类CString。CString类的设计首先,让我们定义CString类的基本设计。一个字符串通常由字符数组和长度组成。我们将使用动态内存分配来管理字符数组,以便字符串的长度可以根据需要进行调整。实现CString类的成员函数接下来,我们将实现CString类的各个成员函数。

CyberBladeX的博客 551

将CString转换为double(或float)的3种方法

CString strFloat;float flt;//method1:flt = (float)atof((char *)(LPTSTR)(LPCTSTR)mstrFloat);//method2:flt = (float)atof((char *)m_eps.GetBuffer(strFloat.GetLength()));strFloat.ReleaseBuffer();//method3

benny5609的专栏 2万+

使用 Java + PaddleOCR 实现表格识别,支持导出 HTML 和 Excel(附源码)

使用Java+PaddleOCR快速搭建表格识别系统,无需处理底层模型细节。系统支持表格结构识别和内容识别,可将图片转换为可编辑表格格式。文章提供了完整的实现流程,包括Maven依赖引入、模型下载(包含检测、识别、分类和表格结构模型)及参数配置说明。SmartJavaAI支持多种高性能模型选择,适用于不同应用场景,帮助开发者快速实现表格识别功能。

deng775747758的博客 1473

VC下CString类型与int 、float等数据类型的相互转换

一、常用转换 1. CString --> int转换 CString str("1234"); int i= _ttoi(str); 2. CString --> float转换 方法一: CString str; float fi; fi=_tstof(str);//转成了do...

825

python爬取巨潮资讯网所有股票年报数据

爬虫获取巨潮资讯网数据

qq_42752524的博客 6112

nbiot和2g_浅谈NBIOT

一、什么是NBIOT?1、概念窄带物联网(Narrow Band Internet of Things, NB-IoT),NB-IoT构建于蜂窝网络,只消耗大约180KHz的带宽,使用License频段,可采取带内、保护带或独立载波等三种部署方式,与现有网络共存。可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。2、NBIOT的特点和目标(1)超强覆盖:相对GPRS来...

weixin_39534100的博客 1704

谈新手对CString的使用 (转)

谈新手对CString的使用 (转)[@more@]CString类功能强大,比STL的string类有过之无不及.新手使用CString时,都会被它强大的功能所吸引.然而由于对它内部机制的不了解,新手在将CString向C的字...

csd3176的博客 131

Wider Face+YOLOV7人脸检测

使用Wider Face数据集训练YOLOV7

chen_znn的博客 8406

转载: 谈新手对CString的使用

function MM_findObj(n, d) { //v4.01var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}if(!

prophet08的专栏 1088

C#上位机+YOLO实战:从环境搭建到实现首个目标检测(零基础入门)

/ YOLOv8的类别名称(共80类,对应COCO数据集)// ONNX推理会话// YOLOv8的输入宽度// YOLOv8的输入高度本文从技术选型、环境搭建到代码实现,详细介绍了如何将C#上位机与YOLOv8结合,实现基础的目标检测功能。整个过程避开了常见的坑点,同时对核心原理和代码逻辑进行了详细解析,希望能帮助零基础的开发者快速入门。实际上,C#上位机+YOLO的组合在工业领域有非常广泛的应用,本文的案例只是一个起点。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 790

SPI 总线信号完整性与时序一致性测试

SPI总线测试的核心目标是验证其电气与时序行为是否满足芯片规格要求,确保通信可靠性

硬核科技 328

VC学习资料收集(3):谈新手对CString的使用

谈新手对CString的使用作者:CString类功能强大,比STL的string类有过之无不及.新手使用CString时,都会被它强大的功能所吸引.然而由于对它内部机制的不了解,新手在将CString向C的字符数组转换时容易出现很多问题.因为CString已经重载了LPCTSTR运算符,所以CString类向constchar *转换时没有什么麻烦,如下所示:char a[100

王君的专栏 1674

045、镜头模组公差链分析:从 Lens 到 Sensor 的装配公差累积与良率优化

本文深入分析了镜头模组从镜片到传感器各环节的公差累积问题及优化策略。文章首先剖析了四级公差链(镜片单体、镜筒装配、VCM定位、传感器贴装)的误差传递机制,指出各环节典型公差值及其影响(如5微米镜片偏差可导致0.02度光线偏折)。其次对比了最坏情况法与均方根法的差异,强调需考虑公差相关性(如镜片曲率与镜筒间隙的正相关性)。最后提出良率优化"三板斧":通过蒙特卡洛仿真优化公差分配、采用主动对准工艺在线补偿、建立数据反馈闭环系统,并结合"阴阳脸"案例说明如何定位根因(模具磨损+贴片机老化导致的误差叠加)。作者总结

sundong_81的博客 59

STM32F407+LAN8720+LwIP以太网通信实战:从CubeMX配置到UDP/TCP收发

在嵌入式系统开发中,以太网通信是实现设备联网、数据采集与远程控制的关键技术。STM32F407内置10/100M以太网MAC,通过RMII接口外接LAN8720 PHY芯片,配合轻量级TCP/IP协议栈LwIP和实时操作系统FreeRTOS,即可构建稳定高效的网络通信方案。其原理在于MAC与PHY协同完成数据帧收发,LwIP提供标准协议解析与套接字接口,FreeRTOS则负责任务调度与资源管理,三者结合兼顾了性能与资源占用。该方案广泛应用于工业设备状态上报、局域网传感器数据上传、远程参数配置等场景。本文基于

ciya3282的博客 379

AgentScope Java 2.0 项目实战:从零构建企业级自主Coding Agent

本文基于 AgentScope Java 框架,完整拆解两个生产级 AI Agent 项目的从零开发全过程。其一是企业级自主编码机器人(agentscope-codingagent),支持 Issue→PR 自动实现、PR Code Review、Docker 沙箱隔离执行与多通道接入;其二是个人 AI 助手管理平台(agentscope-paw),采用 Spring Boot + React 全栈架构,支持多 Agent、技能市场与多 IM 通道。

program哲学 835

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

谈新手对CString的使用 dai2255(原作)

<br />谈新手对CString的使用         dai2255(原作)     <br /><br />     <br /><br /> CString类功能强大,比STL的string类有过之无不及.新手使用CString时,都会被它强大 <br /> 的功能所吸引.然而由于对它内部机制的不了解,新手在将CString向C的字符数组转换时 <br /> 容易出现很多问题.因为CString已经重载了LPCTSTR运算符,所以CString类向const <br

aa19870406的专栏 534

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

浅淡对CString的使用

浅淡对CString的使用 浅淡对CString的使用 CString类功能强大,比STL的string类有过之无不及.新手使用CString时,都会被它强大的功能所吸引.然而由于对它内部机制的不了解,新手在将CString向C的字符数组转换时容易出现很多问题.因为CString已经重载了LPCTSTR运算符,所以CString类向constchar *转换时没有什么麻烦,如下所示:char

SHOOOW博客 2062

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++中Cstring使用小结

 CString类功能强大,比STL的string类有过之无不及.新手使用CString时,都会被它强大的功能所吸引.然而由于对它内部机制的不了解,新手在将CString向C的字符数组转换时容易出现很多问题.因为CString已经重载了LPCTSTR运算符,所以CString类向constchar *转换时没有什么麻烦,如下所示:char a[100];CString str("aaaaaa"

gaoxiaowei的专栏 1056

CString 到 float 的转换 小方法

CString 到 float 的转换 小方法 // 从字符串到浮点数的转换  float StringtoDouble( CString csValue )  {   // 第一种方法   LPTSTR  chValue = csValue.GetBuffer( csValue.GetLength() );   float fValue = atof( chValue ); 

WJJ198809171660的博客 1790

CString的使用

  CString类功能强大,比STL的string类有过之无不及.新手使用CString时,都会被它强大的功能所吸引.然而由于对它内部机制的不了解,新手在将CString向C的字符数组转换时容易出现很多问题.因为CString已经重载了LPCTSTR运算符,所以CString类向const char *转换时没有什么麻烦,如下所示:  char a[100];  CString str("a

860
上一篇: API函数大全
下一篇: 如何设计通用的回调机制
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值