2019年MFC中CString类的用法
mfc cstring replace用法
mfc cstring replace用法MFC CString Replace函数用法-一步一步回答第一步:介绍MFC CString类MFC(Microsoft Foundation Classes)是微软推出的一套用于快速开发Windows应用程序的类库。
其中包括了CString类,它是MFC中的字符串处理类之一。
CString类提供了一种方便的方式来处理和操作字符串,包括查找、替换、分割等功能。
在本篇文章中,我们将专注于CString类的Replace函数的用法。
第二步:解释Replace函数的功能和参数Replace函数是CString类的一个成员函数,用于在一个字符串中替换指定的字符或字符串。
其函数原型如下:int Replace(LPCTSTR lpszOld, LPCTSTR lpszNew);Replace函数接受两个参数,分别是被替换的旧字符串(lpszOld)和替换后的新字符串(lpszNew)。
函数将会找到并替换原字符串中所有匹配的旧字符串。
第三步:演示Replace函数的基本用法让我们以一个简单的例子来演示Replace函数的基本用法。
假设有如下的字符串:CString str = "Hello World!";我们希望将其中的"World"替换为"Universe"。
代码如下:CString str = "Hello World!";CString oldStr = "World";CString newStr = "Universe";str.Replace(oldStr, newStr);执行上述代码后,str的值将被修改为"Hello Universe!"。
可以看到,Replace函数返回的是替换后新字符串中发生改变的字符个数。
cstring 用法
cstring 用法C语言中的字符串是一组字符的序列,以\0(空字符)作为结尾。
在C语言中,字符串的处理非常常见,因此对于字符串的操作有着丰富的函数库。
字符串的基本操作包括字符串的输入与输出、字符串的拷贝、字符串的连接、字符串的比较、字符串的截取等。
1. 字符串的输入与输出:C语言中,字符串的输入可以使用scanf函数,输出可以使用printf函数。
例如:```cchar str[20];printf("请输入一个字符串:");scanf("%s", str);printf("您输入的字符串是:%s\n", str);```这段代码从终端读取一个字符串,并输出到终端。
2. 字符串的拷贝:C语言中,可以使用strcpy函数将一个字符串拷贝到另一个字符串中。
例如:```c#include <string.h>char str1[] = "Hello";char str2[20];strcpy(str2, str1);printf("拷贝后的字符串为:%s\n", str2);```这段代码将字符串"Hello"拷贝到str2中,并输出拷贝后的字符串。
3. 字符串的连接:C语言中,可以使用strcat函数将两个字符串连接起来。
例如:```c#include <string.h>char str1[] = "Hello";char str2[] = " world!";strcat(str1, str2);printf("连接后的字符串为:%s\n", str1);```这段代码将字符串"Hello"和" world!"连接起来,并输出连接后的字符串。
4. 字符串的比较:C语言中,可以使用strcmp函数来比较两个字符串的大小关系。
cstringlist用法 -回复
cstringlist用法-回复CStringList是MFC(Microsoft Foundation Class)中的一个类,主要用于管理一组C-style字符串的链表。
本篇文章将逐步回答与CStringList 相关的各个方面,包括使用方法、常见操作以及示例代码等。
一、什么是CStringList?在介绍具体使用方法前,我们先来了解一下CStringList的基本概念。
CStringList是MFC中的一个类,它是一个模板类,用于管理C-style字符串的链表。
它提供了一系列的成员函数和操作符重载,方便我们对链表进行访问和操作。
二、如何创建和初始化一个CStringList对象?要使用CStringList,首先需要在代码中包含头文件Afxcoll.h,并且使用using声明:cpp#include <afx.h>#include <afxtempl.h>using namespace std;接下来,我们可以通过两种方式创建和初始化一个CStringList对象。
1. 通过默认构造函数创建一个空链表:cppCStringList list;2. 通过将已有的链表作为参数传入构造函数进行初始化:cppCStringList list2(list);这样就可以创建并初始化一个CStringList对象了。
三、常见操作1. 插入元素我们可以使用AddHead和AddTail函数在链表的头部和尾部插入新的元素。
例如:cpplist.AddHead(_T("Hello"));list.AddTail(_T("World"));这样就在链表中插入了两个元素。
2. 获取链表大小可以使用GetCount函数获取链表中的元素个数:cppint count = list.GetCount();3. 访问链表元素CStringList提供了一系列的迭代器(iterator)用于访问链表的元素。
MFC中字符串操作方法的总结
在VC的编程中,常常遇到需要对字符串进行格式化处理,所谓的格式化,我自己的定义是如下的过程,例如说,需要输出一个字符串“This is charpter %d”,其中的%d,用变量int chp 来代替,生成这种字符串的操作我成为“格式化”,下面介绍一下有关的操作:1.CString类,这个类在MFC中如果启用了UNICODE码后,就是CStringT类,注意在查找MSDN时,需要查找的是CStringT这个类,该类与很多操作都是兼容的,特别是使用UNICODE码的情况下,该类提供了一个格式化字符串的函数:Format函数,该函数可以直接将格式化的字符串用%d, %s之类的格式符来描述,举个例子来说:CString mystr;int times = 0;mystr. Format ( _T(“This is my %d try!”), times);值得说明的是CString提供了字符串操作的一系列函数,包括比较大小,大小写转换,字符串的连接,字符串的相等和寻找等,需要时,直接参考MSDN就可以了2.sprintf: 虽然说CString类有着许多的优点,但是并不能包办所有的操作,最直接的一个问题就是CString并不能直接赋值给一个字符串变量,即CString类并没有提供一种调用,可以将其内部的字符串赋值给一个字符串变量,如果要进行这种操作,则必须手动编程完成,但是某些函数中又必须要用到字符串数组类型,这个时候又面临一个问题,即字符串数组该怎样来格式化,这个时候需要调用sprintf函数,该函数是个全局函数,其调用的格式如下:sprintf( buffer, " String: %s\n", s );该函数中,buffer是需要被格式化的字符串数组,而“”中的内容就是格式化内容,最后的则是各种数字或这字符串等,该函数很方便使用目前用到的格式化字符串操作,用以上两种思路都可以基本上解决,在使用注意UNICODE 就行了,如果用到了UNICODE码,注意用_T()来进行转换。
mfc整数转字符串
mfc整数转字符串MFC整数转字符串的方法及应用一、引言在MFC编程中,经常会遇到整数转字符串的需求。
整数转字符串是指将一个整数类型的数据转换为字符串类型的数据,方便在界面上显示或进行其他操作。
本文将介绍MFC中整数转字符串的方法,并结合实际应用场景进行说明。
二、方法一:使用CString类1. 首先,我们需要将整数类型的数据存储在一个整型变量中,例如int n = 123。
2. 然后,我们可以使用CString类的Format方法将整数转换为字符串。
具体代码如下:```cppCString str;str.Format(_T("%d"), n);```这里的"%d"是格式化字符串,表示将整数以十进制形式输出。
三、方法二:使用std::to_string函数1. 首先,我们需要将整数类型的数据存储在一个整型变量中,例如int n = 123。
2. 然后,我们可以使用std::to_string函数将整数转换为字符串。
具体代码如下:```cppstd::string str = std::to_string(n);```这里的std::string是C++标准库中的字符串类型,to_string 是该库中的函数,用于将各种类型的数据转换为字符串。
四、应用场景一:整数转字符串显示在界面上在实际开发中,我们经常需要将整数类型的数据显示在界面上,例如将一个整型变量的值显示在一个静态文本框中。
以下是一个示例代码:```cppint n = 123;CString str;str.Format(_T("%d"), n);GetDlgItem(IDC_STATIC_TEXT)->SetWindowText(str);```这里的IDC_STATIC_TEXT是一个静态文本框的控件ID,GetDlgItem 是MFC中的函数,用于获取指定控件的指针。
cstringlist用法
CStringList是MFC编程中的一种数据结构,相当于C++的STL中的链表。
它是一个CString的链表,其用法非常简洁。
以下是一些常用的CStringList方法:
1. 插入数据:可以使用`AddTail()`或`AddHead()`在列表的尾部或头部插入元素。
2. 删除数据:可以使用`RemoveAll()`删除所有元素,使用`RemoveAt()`删除指定位置的元素,使用`RemoveHead()`删除头部元素,使用`RemoveTail()`删除尾部元素。
3. 获取元素个数:可以使用`GetCount()`返回列表中的元素数目。
4. 获取元素值:可以使用`GetAt()`和`FindIndex()`获取位于给定位置的元素。
例如,`cstringList.FindIndex(index)`将返回索引指定的元素的位置。
5. 获取头尾元素:可以使用`GetHead()`获取列表的头部元素,使用`GetTail()`获取尾部元素。
6. 遍历列表:推荐使用上述的方法进行遍历,而不是使用POSITION变量。
CString类的原理与使用
CString类的原理与使用先定义几个以后会用到的变量:CString str1, str2, str3;概括说明:MFC对CString类的封装可能的确不如std::string完善,但是也的确不错,功能也足够强大,使用上还很体贴。
其基本特征为:CString类没有基类。
CString类和LPCTSTR的关系:MSDN上说“CString objects follow "value semantics." Think of a CString object as an actual string, not as a pointer to a string.”也就是说用的时候除了考虑使用它的成员函数的方式,就把它当作普通的c-style字符串来使用就行了。
你可以在构造函数中使用LPCTSTR:CString str("Hello World!");可以:str1 = str2; 或者 str1 = “Hello”;也可以:str3 = str1 + str2; 或者 str3 = str1 + “Hello”;当然也可以:str1 += str2; 或者 str1 += “Hello”;实际上下列的这些操作符都可以用在CString对象之间或者CString和LPCTSTR对象之间:==、!=、<、>、<=、>=自然,将CString对象强制转换到LPCTSTR类型也就应该在情理之中:LPCTSTR string = (LPCTSTR) str1;CString支持UNICODE和多字节字符集(MBCS)。
因为其本身是基于TCHAR的——当然你不要忘了定义编码方式,如:#define _UNICODE。
CString支持引用计数。
可以通过其成员函数LockBuffe/和UnLockBuffer来禁用/启用引用计数。
对于CString类的成员函数的定义、说明、返回值等形式在此并不赘述,如有此疑问请参阅:中的相关链接。
CString类用法
1、字符表示及_TTo write your application so that it can be compiled for Unicode or for ANSI,code literal strings by using the_T macro.For more information,see Unicode and Multibyte Character Set(MBCS)Support.字符串内码标示有ANSI(8位)、Unicode(16位)、多字节MBCS三种,为了在应用程序中自动处理字符串的内码表示,可以用使用_T(“”)宏,圆括号中跟上字符串。
2、CString类Class CString is based on class template CStringT Class.CString is a typedef of CStringT. More exactly,CString is a typedef of an explicit speciali zat ion of CStringT,which is a common way to use a class template to define a class.Similarly defined classes are CStringA and CStringW.For more information on explicit specializ ation,see Class Template Instantiation.CString,CStringA,and CStringW are defined in atlstr.h.CStringT is defined in cstringt.h.CString,CStringA,and CStringW each get a set of the methods and operators defined by CStringT for use with the string data they support.Some of the methods duplicate and,in some cases,surpass the string services of the C run-time libraries.Note:CString is a native class.For a string class that is for use in a C++/CLI managed project, use System.String.CString类是CStringT模版类的类型重定义,更准切地说是CStringT的类型显示定义。
第二讲:MFC框架下的CString类
第二讲:MFC框架中的CString类为了能够方便程序员制作项目,提高编程的效率。
因此,微软在MFC框架中提供了一些常用的类。
这些类虽然在标准库中也可以实现,但是相对于标准库中的代码来说,真的是优化了不少,处理算法的效率也有所提高。
字符串大家一定都不会陌生,在MFC框架中为我们提供的字符串类为CString类,它的作用就好像我们以前学的string类型一样。
当然,无论是CString 还是string类型他们都是在C++中实现的类,而不是如同int,float一般是基本的数据类型。
因此CString和string都有各自的成员函数和数据成员,只是我们平时很少使用到罢了。
在这里我推荐大家使用MFC下的CString,毕竟标准库的中string类实在是太过久远了,很多时候操作起来都不是很方便。
当然,有什么是比调用函数更加方便的事情呢?所有的算法别人都做好了,而我们要做的,就只是记住这些函数的名字和调用的格式而已,完全不需要动脑子了……扯了一点有的没的,希望大家别介意呀!言归正传!现在让我们一起来聊聊CString这个类吧!当然,有一件事情请大家一定别忘记:CString类位于头文件afx.h中,因此要想使用CString类就必须要先使用#include <afx.h> 指令将这个头文件包含到你的程序中。
【CString类的构造函数】首先,我们来学习一下如何使用CString构造一个字符串对象。
在前面我们学习过,要想使用一个类构造对象,就需要调用它的构造函数,因此我们要想知道如何定义CString对象,就得先知道它支持哪些构造函数。
CString所支持的构造函数如下:1、CString():它是CString类中的默认构造函数,通常用于初始化一个空的字符串对象,使用的方法也很简单,通常你可以这样使用它:2、CString(const CString& stringSrc):这是CString类型的拷贝构造函数,我们可以看到它的参数是一个CString 对象,它用于在构造新的对象时,将其他CString对象的值复制到当前的对象中。
MFC中CString操作指南
CStrin g类一、常用成员函数1.i nt Ge tLeng th() cons t;说明:获取CS tring类对象包含字符串的长度(字符数)。
2.BOOLIsEmp ty() cons t;说明:测试CS tring类对象包含的字符串是否为空。
3.voi d Emp ty();说明:使CStr ing类对象包含的字符串为空字符串。
4.TCHA R Get At(i nt nI ndex) con st;说明:获得字符串指定位置处的字符。
5.T CHARopera tor []( in t nIn dex ) cons t;说明:获得字符串指定位置处的字符,作用和Ge tAt()一样。
6.void SetA t( in t nIn dex,TCHAR ch );说明:设定字符串指定位置处的字符。
7.ope rator LPCT STR () co nst;说明:返回指向储存在CStri ng类对象内的字符串指针。
8.MidMid函数有两个重载函数:C Strin g Mid( int nFir st )const; thr ow(C Memor yExce ption);获取从nFi rst位置开始的子串。
CSt ringMid(int n First, int nCou nt )const; thr ow(C Memor yExce ption);获取从nFi rst位置开始包含n Count个字符的子串。
9.CStri ng Le ft(i nt nC ount) con st;th row(CMemo ryExc eptio n );说明:获取字符串左边nCoun t长度的字符串。
cstring用法
cstring用法cstring是C++中的一个头文件,它提供了一系列的字符串处理函数,可以用来操作字符串,如比较、拷贝、查找、替换等。
首先,cstring提供了一系列的字符串比较函数,如strcmp()、strncmp()、strcoll()等,可以用来比较两个字符串的大小,以便确定字符串的排序顺序。
其中,strcmp()函数用于比较两个字符串,如果第一个字符串比第二个字符串小,则返回一个负数;如果两个字符串相等,则返回0;如果第一个字符串比第二个字符串大,则返回一个正数。
此外,cstring还提供了一系列的字符串拷贝函数,如strcpy()、strncpy()等,可以用来将一个字符串拷贝到另一个字符串中。
其中,strcpy()函数用于将源字符串拷贝到目标字符串中,如果源字符串的长度大于目标字符串的长度,则只会拷贝目标字符串长度的字符,而不会拷贝源字符串剩余的字符。
此外,cstring还提供了一系列的字符串查找函数,如strchr()、strstr()等,可以用来在字符串中查找指定的字符或字符串。
其中,strchr()函数用于在字符串中查找指定的字符,如果找到,则返回该字符的指针;如果没有找到,则返回NULL。
最后,cstring还提供了一系列的字符串替换函数,如strreplace()等,可以用来将字符串中的某个字符或字符串替换为另一个字符或字符串。
其中,strreplace()函数用于将字符串中的某个字符或字符串替换为另一个字符或字符串,如果替换成功,则返回替换后的字符串;如果替换失败,则返回NULL。
总之,cstring提供了一系列的字符串处理函数,可以用来操作字符串,如比较、拷贝、查找、替换等,为C++程序开发提供了很大的便利。
MFC常用类CString
1.使• CFile类有两个带参数的构造函数。其中,带一个参数的构造函数的原 型如下: • 该构造函数已经打开了一个文件,参数hFile就是打开文件的文件句柄。 该函数将新创建的CFile对象绑定到一个已经打开的文件句柄上。 HFile可以赋值给CFile的成员变量m_hFile。HFile也可以使用 CreateFile()函数打开。CreateFile()函数的原型如下:
8.2.1 CTime类
• 在CTime类中,还有许多和GetCurrentTime()类似的函数,如表8.3所示。
• 使用CTime类获取的当前系统时间可以转化成字符串,此时可以使用 CTime类的Format函数。Format函数的原型有以下两种:
8.2.2 CTimeSpan类
• CTimeSpan类主要用于保存两个时间之间的间隔。CTimeSpan类的构 造函数有以下三种:
8.1.5 字符串的比较
• 字符串的比较是根据字母对应的ASCII值。当两个字符串进行进行比 较时,首先从第一个字符开始进行比较。如果两个字符串的第一个字 母的ASCII值相同,则比较第二个字母。依此类推,直到比较完为止。 • 在CString类中,比较字符串的函数有两个,分别如下: • • 和 • 其中,Compare()函数在比较时区分大小写,而CompareNoCase()函数 则不区分大小写。
8.2 日期、时间类
• 在Visual C++中,有关日期和时间的类有两个:CTime类和CTimeSpan 类。CTime表示是的绝对时间,而CTimeSpan表示的是时间差。本节 将分别对这个两个类进行详细介绍。
8.2.1 CTime类
• CTime类计算的时间是从1970年1月1日之后的秒数。由于CTime类没 有基类,因此它可以在程序中任意位置调用。通常情况下,构造一个 CTime对象采用如下方式: • 【示例8-18】构造一个CTime类对象。 • 上述内容表示的时间是2008年5月19日22时18分33秒。 • 如果想要获取当时系统时间,可以使用GetCurrentTime()函数,代码如 下:
mfc cstring 构造
MFC CString 构造介绍MFC(Microsoft Foundation Classes)是微软公司为开发Windows应用程序提供的一套C++类库。
其中,CString是MFC中常用的字符串类之一。
在本文中,我们将探讨MFC CString的构造方法。
CString提供了多种构造函数,用于创建不同种类的字符串对象。
我们将深入了解这些构造函数的详细用法和应用场景。
构造函数的基本用法CString的构造函数用于创建一个CString对象,并将字符串赋给它。
其基本语法如下:CString();CString(LPCTSTR lpsz);•CString():默认构造函数,创建一个空的CString对象。
•CString(LPCTSTR lpsz):带参数的构造函数,创建一个CString对象并将lpsz指向的字符串赋给它。
构造函数示例示例1:使用默认构造函数创建空字符串CString str; // 创建一个空的CString对象通过默认构造函数创建的CString对象是一个空字符串对象,它不包含任何字符。
示例2:使用带参数的构造函数创建非空字符串CString str("Hello, world!"); // 创建一个CString对象,并将字符串赋给它通过带参数的构造函数创建的CString对象会根据传入的字符串来初始化自己,上述示例中的str对象将包含字符串”Hello, world!“。
示例3:使用带参数的构造函数创建CString对象并赋初值CString str = "Hello, world!"; // 创建一个CString对象,并将字符串赋给它上述代码与示例2的效果相同,都是创建一个CString对象,并将字符串赋给它。
提供其他CString类的构造函数除了前面提到的基本构造函数外,CString还提供了其他构造函数,用于更灵活地创建和初始化CString对象。
MFC中关于CString
MFC的字符串CString处理
CStrin g是MFC提供的类,ch ar* 是指向ANS I字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
LP的含义是长指针(lon g poi nter)。
LPST R是一个指向以…\0‟结尾的A NSI字符数组的指针,与cha r*可以互换使用,在win32中较多地使用LPST R。
而L PCSTR中增加的…C‟的含义是“CON STANT”(常量),表明这种数据类型的实例不能被使用它的A PI函数改变,除此之外,它与L PSTR是等同的。
1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在wi n32下是没有区别的,都是32位.所以这里的LP和P是等价的.2.C表示con st3.T是什么东西呢,我们知道TCH AR在采用Unico de方式编译时是wc har_t,在普通时编译成ch ar.为了满足程序代码国际化的需要,业界推出了Unico de标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Uni code(类型为wc har_t)是一种被鼓励的做法。
LP WSTR与LPCWS TR由此产生,它们的含义类似于LPSTR与LPCS TR,只是字符数据是16位的w char_t而不是c har。
然后为了实现两种编码的通用,提出了TC HAR的定义:如果定义_UN ICODE,声明如下:typ edefwchar_t TC HAR;如果没有定义_UNI CODE,则声明如下:typ edefcharTCHAR;LP TSTR和LPCTS TR中的含义就是每个字符是这样的TCHA R。
MFCCString用法小结
MFCCString⽤法⼩结MFC CString ⽤法⼩结1. 初始化⽅法:(1) 直接复制,如Cstring=”mingrisoft”;(2) 通过构造函数初始化,如CString str(… ?,100)//与分配100个字节,填充空格char* p=”feiqiang”; Cstring(p);delete p.(3) 加载⼯程中的字符串资源,如CString str;str.LoadString(IDS_STR);(4) 使⽤CString类的成员函数Format初始化,如CString str; int i=0; str.Format(“value:%d”,i);2. 将CString转化为char*,如CString str=”feqiang”;char *p;p=str.GetBuffer();delete p;将char*转化为CString,如:char* p=”feiqiang”;p[len(p)]=?\0?;Cstring str(p);char* 和char数组的转化:char buf[5] ={…a?,?b?,?c?};char *p;p=new char[5];p=buf;将字符串转化为数字:CString str=”12”;int i=atoi(str);long j=atoll(str);float f=atof(str);将数字转化为字符串:CString str;int i=12;str.Format(“%d”,i);long j=12;str,Format(“%ld”,j);同理其他类型。
3. 字符串的相关操作即⽅法的使⽤:(1) 提取字符串中的中⽂,如CString strtext,temp,strres;GetLlgItem(IDC_TEXT)->GetWindowText(strtext);//通过ID获取编辑框中的⽂本for(int =\0;ichar ch=strtext.GetAt(i);if(IsDBCSLeadByte(ch)){ //判断字符是否是双字节编码的前⼀个字节tmp=strtext.Mid(i,2);//截取索引index1到index2的字符[ )i++;stress+=tmp;}GetLlgItem(IDC_RESULT)->SetWindowText(strtes);//设置⽂本框中的⽂本}(2) 英⽂字符串⾸字母⼤写,如将以空格符分隔的英⽂单词的第⼀个字母⼤写(⼩写)str.GetAt(i);//提取字符串索引为i个字母str.MakeLower();//转化为⼩写tmp.MakeUpper();//转化为⼤写(2) 按制定符号分割字符:int pos=str.Find(strchar);//查找字符,如果没找到,则返回0,找到则返回字符的位置,参数可以是字符也可以是字符串while(pos>0){str1=str.Left(pos);//取左,参数为字符串的个数str=str.Right(str.GetLength-pos-1);//取右,参数同上tmp.Format(“%s\r\n”,str1);//字符串中\r\n代表回车化⾏符strres+=tmp;pos=str.Find(strchar);}(3) 删除指定的中⽂:m_text.GetWindowText(strtxt);m_text.GetSel(istart,iend);//得到⽂本框中选中的⽂本,并且得到⽂本的头索引和尾索引if(istart==iend){return;}str1=strtxt.Left(istart);if(iend>=strtxt.GetLength()){str2=””;}else{str2=strtxt.Right(strtxt.GetLength()-iend);}strres+=str1;strres+=str2;(4) 替换字符串:strtxt.Replace(strchar,strnew);//⽤新串替换旧串(5) 根据CPoint查找位置:CPoint pt;//获取字符串时获取⿏标所在字符串的位置int pos=m_text.CharFromPos(pt);//根据pt获取字符串中的位置,即其左侧字符的位置if(str.IsEmpty()){//判断字符串是否为空m_num.AddString(strres);//⽂本框追加字符串}将字符转化为⼤写:ch=ch-32;(6) 字符串忽略⼤⼩写的⽐较:CString str=”feiqiang”;int com=/doc/88f5810e7cd184254b3535e6.html pareNoCa se(“mingri”);//如果相等返回0,否则返回-1;(7) 连接换⾏符:CString str=”feiqiang\t”;(8) 字符反转:str.MakeReverse();(9) 取出⾸位空格:str.TrimLeft(); str.TrimRight();取出字符串中的所有空格,str.Replace(“ ”,””);(10) 在ListBox中查找字符串int index=::SendMessage(m_stringlist.GetSafeHwnd(),LB_FINDSTRINGEXACT,-1, (LPARAM)(LPCTSTR)strtext));//通过SendMessage函数向列表控件发送LB_FINDSTRINGEXACT消息来查找指定字符串是否在列表空间中,如果存在则返回索引位置。
MFC的CByteArray、CString类完成动态字节数组使用
MFC的CByteArray、CString类完成动态字节数组使用MFC的CByteArray、CString类完成动态字节数组使用在C语言中,经常定义一个这样的数组:[cpp] view plaincopy1.unsigned char buf[100] = {0};但这个数组的长度是固定的,不能动态变化。
在MFC中,可以使用CByteArray、CString达到这个目的:[cpp] view plaincopy1.//--------------------------------------------2.// 使用CString 的对无符号字节的存取3.//--------------------------------------------4.// 写入5.CString buf1;6.buf1 += (unsigned char)0x01;7.buf1 += (unsigned char)0x02;8.buf1 += (unsigned char)0x10;9.buf1 += (unsigned char)0xFF;10.11.12.//读取13.printf("%d\n", buf1.GetLength());14.CString str;15.CString str1;16.for (int i=0; i<buf1.GetLength(); i++)17.{18.unsigned char x = (unsigned char)buf1[i];19.str.Format("%02x ", x);20.str1 += str;21.}22.AfxMessageBox(str1);23.24.25.//--------------------------------------------26.// 使用CByteArray 对无符号字节的存取27.//--------------------------------------------28.//写入29.CByteArray arry;30.arry.Add(0x41);31.arry.Add(0x00);32.arry.Add(0xFF);33.arry.Add(0x22);34.35.//读取36.str1.Empty();37.for (i=0; i<arry.GetSize(); i++)38.{39.unsigned char x = (unsigned char)arry[i];40.str.Format("%02x ", x);41.str1 += str;42.}43.AfxMessageBox(str1);CByteArray用起来比较直观,不说了;使用CString时,不管是读取或者写入,一定注意使用(unsigned char)转型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CString 是一种很有用的数据类型。
它们很大程度上简化了MFC中的许多操作,使得M FC在做字符串操作的时候方便了很多。
不管怎样,使用CString有很多特殊的技巧,特别是对于纯C背景下走出来的程序员来说有点难以学习。
这篇文章就来讨论这些技巧。
使用CString可以让你对字符串的操作更加直截了当。
这篇文章不是CString的完全手册,但囊括了大部分常见基本问题。
这篇文章包括以下内容:CString 对象的连接格式化字符串(包括int 型转化为CString )CString 型转化成int 型CString 型和char* 类型的相互转化char* 转化成CStringCString 转化成char* 之一:使用LPCTSTR强制转化CString 转化成char* 之二:使用CString对象的GetBuffer方法CString 转化成char* 之三: 和控件的接口CString 型转化成BSTR 型;BSTR 型转化成CString 型;V ARIANT 型转化成CString 型;载入字符串表资源;CString 和临时对象;CString 的效率;总结下面我分别讨论。
1、CString 对象的连接能体现出CString 类型方便性特点的一个方面就字符串的连接,使用CString 类型,你能很方便地连接两个字符串,正如下面的例子:CString gray("Gray");CString cat("Cat");CString graycat = gray + cat;要比用下面的方法好得多:char gray[] = "Gray";char cat[] = "Cat";char * graycat = malloc(strlen(gray) + strlen(cat) + 1);strcpy(graycat, gray);strcat(graycat, cat);2、格式化字符串与其用sprintf() 函数或wsprintf() 函数来格式化一个字符串,还不如用CString 对象的Format()方法:CString s;(_T("The total is %d"), total);用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。
格式化是一种把其它不是字符串类型的数据转化为CString类型的最常用技巧,比如,把一个整数转化成CString类型,可用如下方法:CString s;(_T("%d"), total);我总是对我的字符串使用_T()宏,这是为了让我的代码至少有Unicode的意识,当然,关于Unicode的话题不在这篇文章的讨论范围。
_T()宏在8位字符环境下是如下定义的:#define _T(x) x . };Whatever data[] = {{ ... },...{ ... },};for(int i = 0; i < DIM(data); i++) 1.2f4.8f."表示的)并没有隐含一个强制类型转换操作符。
你会得到什么结果呢?一个令人惊讶的结果,我们得到的实际结果串是:"Mew! I love GrayCat"。
因为MFC 的设计者们在设计CString 数据类型时非常小心,CString 类型表达式求值后指向了字符串,所以这里看不到任何象Format 或sprintf 中的强制类型转换,你仍然可以得到正确的行为。
描述CString 的附加数据实际上在CString 名义地址之后。
有一件事情你是不能做的,那就是修改字符串。
比如,你可能会尝试用","代替"."(不要做这样的,如果你在乎国际化问题,你应该使用十进制转换的National Language S upport 特性,),下面是个简单的例子:CString v(""); ; .if(p != NULL)*p = _T(\0);();这是GetBuffer 的第一种用法,也是最简单的一种,不用给它传递参数,它使用默认值0,意思是:"给我这个字符串的指针,我保证不加长它"。
当你调用ReleaseBuffer 时,字符串的实际长度会被重新计算,然后存入CString 对象中。
必须强调一点,在GetBuffer 和ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的CString 对象的任何方法。
因为ReleaseBuffer 被调用之前,该CSt ring 对象的完整性得不到保障。
研究以下代码:CString s(...);LPTSTR p = ();这个指针p 发生了很多事情int n = (); ....", args, ...); . 部分省略许多细节CString s = buffer;虽然更好的形式可以这么做:CString s;(_T("%...."), args, ...);如果你的字符串长度万一超过256 个字符的时候,不会破坏堆栈。
另外一个常见的错误是:既然固定大小的内存不工作,那么就采用动态分配字节,这种做法弊端更大:int len = lstrlen(parm1) + 13 lstrlen(parm2) + 10 + 100;char * buffer = new char[len];sprintf(buffer, "%s is equal to %s, valid data", parm1, parm2);CString s = buffer;......delete [] buffer;它可以能被简单地写成:CString s;(_T("%s is equal to %s, valid data"), parm1, parm2);需要注意sprintf 例子都不是Unicode 就绪的,尽管你可以使用tsprintf 以及用_T() 来包围格式化字符串,但是基本思路仍然是在走弯路,这这样很容易出错。
CString to char * 之三:和控件的接口;我们经常需要把一个CString 的值传递给一个控件,比如,CTreeCtrl。
MFC为我们提供了很多便利来重载这个操作,但是在大多数情况下,你使用"原始"形式的更新,因此需要将墨某个串指针存储到TVINSERTITEMSTRUCT 结构的TVITEM 成员中。
如下:TVINSERTITEMSTRUCT tvi;CString s;. 为s赋一些值。
= s; . 填写tvi的其他域HTREEITEM ti = (&tvi);为什么编译器会报错呢?明明看起来很完美的用法啊!但是事实上如果你看看TVITE M 结构的定义你就会明白,在TVITEM 结构中pszText 成员的声明如下:LPTSTR pszText;int cchTextMax;因此,赋值不是赋给一个LPCTSTR 类型的变量,而且编译器无法知道如何将赋值语句右边强制转换成LPCTSTR。
好吧,你说,那我就改成这样:= (LPCTSTR)s; .;do lots of stuff... = a; . lots more stuff... = a; .;int * p = &i;do lots of stuff... = a; . lots more stuff(*p)++; . and other stuff... = a; . assorted initialization of other fields of tvi= (MY_LIMIT);= MY_LIMIT;(&tvi);();可以看出来,其实上面的代码对所有类型的Set 方法都适用,但是并不需要这么做,因为所有的类Set 方法(包括Insert方法)不会改变字符串的内容。
但是当你需要写C String 对象时,必须保证缓冲是可写的,这正是GetBuffer 所做的事情。
再次强调:一旦做了一次GetBuffer 调用,那么在调用ReleaseBuffer 之前不要对这个CString 对象做任何操作。
5、CString 型转化成BSTR 型当我们使用ActiveX 控件编程时,经常需要用到将某个值表示成BSTR 类型。
BSTR 是一种记数字符串,Intel平台上的宽字符串(Unicode),并且可以包含嵌入的NULL 字符。
你可以调用CString 对象的AllocSysString 方法将CString 转化成BSTR:CString s;s = ... ; .; . 剩下的类型转换由读者自己完成default:ASSERT(FALSE); c 文件中:STRINGTABLEIDS_READING_FILE "Reading file %s"IDS_WRITING_FILE "Writing file %s"END注意:这些资源都以Unicode 的格式保存,不管你是在什么环境下编译。
他们在Win9x系统上也是以Unicode 的形式存在,虽然Win9x 不能真正处理Unicode。
然后你可以这样使用这些资源:.)fmt = "Reading file %s";elsefmt = "Writing file %s";....)(IDS_READING_FILE);else(DS_WRITING_FILE);....YYYYYY"为了确认是不是我的CString 数据出了问题,我试着用GetBuffer,然后强制转化成char*,LPCSTR。
GetBuffer 返回的值是正确的,但是当我把它赋值给char* 时,它就变成垃圾了。
以下是我的程序段:char* szName = GetName().GetBuffer(20);RegSetValueEx(hKey, "Name", 0, REG_SZ,(CONST BYTE *) szName,strlen (szName + 1));这个Name 字符串的长度小于20,所以我不认为是GetBuffer 的参数的问题。
真让人困惑,请帮帮我。
亲爱的Frustrated,你犯了一个相当微妙的错误,聪明反被聪明误,正确的代码应该象下面这样:CString Name = GetName();RegSetValueEx(hKey, _T("Name"), 0, REG_SZ,(CONST BYTE *) (LPCTSTR)Name,() + 1) * sizeof(TCHAR));为什么我写的代码能行而你写的就有问题呢?主要是因为当你调用GetName 时返回的CString 对象是一个临时对象。