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的类型显示定义。
- 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 对象是一个临时对象。