关于CString总结
cstring 分割函数
cstring 分割函数Cstring分割函数是一种非常常用的字符串处理函数,在C++语言中,字符串是一个非常重要的数据类型,因此对于字符串的处理,也是一个需要掌握的技能。
一、Cstring分割函数的基本概念Cstring分割函数的基本概念就是将一个字符串按照指定的分隔符进行分割,得到一个字符串数组。
例如,将一个以空格为分隔符的字符串"hello world"进行分割,得到的字符串数组就是{"hello", "world"}。
二、Cstring分割函数的实现原理Cstring分割函数的实现原理是通过一个循环来遍历整个字符串,判断每个字符是否为分隔符,如果是,则将前面的字符组成一个字符串,并将其存储到字符串数组中。
需要注意的是,最后一个字符串后面可能没有分隔符,因此需要额外处理一下。
具体实现可以参考以下代码:```c++#include <iostream>#include <cstring>using namespace std;int main(){char str[] = "hello world";char *p = strtok(str, " ");while (p != NULL){cout << p << endl;p = strtok(NULL, " ");}return 0;}```三、Cstring分割函数的应用场景Cstring分割函数可以应用于很多场景,比如对于一个用户输入的字符串,需要将其中的单词分离出来,或者对于一个CSV文件,需要将其中的每一行都进行分割,得到一个二维数组。
四、Cstring分割函数的优缺点Cstring分割函数的优点是实现简单,可以快速地将一个字符串分解为若干个子字符串。
缺点是只能处理单个字符作为分隔符,如果需要处理多个字符作为分隔符,就需要进行额外的处理。
CString用法
需要强制类型转化时,C++规则容许这种选择。
比如,你可以将(浮点数)定义为将某个复数(有一对浮点数)进行强制类型转换后只返回该复数的第一个浮点数(也就是其实部)。
可以象下面这样:Complex c(1.2f,4.8f);float realpart=c;如果(float)操作符定义正确的话,那么实部的的值应该是1.2。
这种强制转化适合所有这种情况,例如,任何带有LPCTSTR类型参数的函数都会强制执行这种转换。
于是,你可能有这样一个函数(也许在某个你买来的DLL中):BOOL DoSomethingCool(LPCTSTR s);你象下面这样调用它:CString file("c:¥¥myfiles¥¥coolstuff")BOOL result=DoSomethingCool(file);它能正确运行。
因为DoSomethingCool函数已经说明了需要一个LPCTSTR类型的参数,因此LPCTSTR被应用于该参数,在MFC 中就是返回的串地址。
如果你要格式化字符串怎么办呢?CString graycat("GrayCat");CString s;s.Format("Mew!I love%s",graycat);注意由于在可变参数列表中的值(在函数说明中是以"..."表示的)并没有隐含一个强制类型转换操作符。
你会得到什么结果呢?一个令人惊讶的结果,我们得到的实际结果串是:"Mew!I love GrayCat"。
因为MFC的设计者们在设计CString数据类型时非常小心,CString类型表达式求值后指向了字符串,所以这里看不到任何象Format或sprintf中的强制类型转换,你仍然可以得到正确的行为。
描述CString的附加数据实际上在CString名义地址之后。
CString字符串操作函数汇总
int ReverseFind( TCHAR ch ) const;
从后向前查找第一个匹配,找到时返回下标。没找到时返回-1
例:csStr="abba";
cout<<csStr.ReverseFind('a'); //3
void Format( LPCTSTR lpszFormat, ... );
void MakeLower( );
将大写字母转换为小写字母
例:csStr="ABCDEF中文123456";
csStr.MakeLower();
cout<<csStr; //abcdef中文123456
int Compare( LPCTSTR lpsz ) const;
cout<<csStr.Find('b',0); //1
cout<<csStr.Find("de",4); //-1
cout<<csStr.Find("de",0); //3
//当nStart超出对象末尾时,返回-1。
//当nStart为负数时,返回-1。
CString SpanExcluding( LPCTSTR lpszCharSet ) const;
返回对象中与lpszCharSet中任意匹配的第一个字符之前的子串
例:csStr="abcdef";
cout<<csStr.SpanExcluding("cf"); //ab
csStr.TrimLeft("ab");
VS2010和MFC编程入门之42(MFC常用类:CString类)
VS2010MFC编程入门之四十二(MFC常用类:CString类)理解了分割窗口的有关知识,这里开始讲解MFC的一些常用类,先来说说CString类。
CString类简介CString类作为MFC的常用类,当之无愧。
可以这样说,只要是从事MFC开发,基本都会遇到使用CString类的场合。
因为字符串的使用比较普遍,而CString类又提供了对字符串的便捷操作,所以它给MFC开发人员带来了高的开发效率,受到了开发者的欢迎。
大家使用VS2010的话,可能会见到CStringT,实际上它是一个操作可变长度字符串的模板类。
CStringT模板类有三个实例:CString、CStringA和CStringW,它们分别提供对TCHAR、char和wchar_t字符类型的字符串的操作。
char类型定义的是Ansi字符,wchar_t类型定义的是Unicode字符,而TCHAR取决于MFC工程的属性对话框中的Configuration Properties->General->Character Set属性,如果此属性为Use Multi-Byte Character Set,则TCHAR类型定义的是Ansi字符,而如果为Use Unicode Character Set,则TCHAR类型定义的是Unicode字符。
三个字符串类的操作是一样的,只是处理的字符类型不同。
鸡啄米以CString类为讲解对象。
CString类的字符串操作1. CString类的构造函数CString类有很多构造函数,这里只介绍几个比较常用的:CString(constCString&stringSrc);将一个已经存在的CString对象stringSrc的内容拷贝到该CString对象。
例如:C++代码CString str1(_T("")); // 将常量字符串拷贝到str1 CString str2(str1); // 将str1的内容拷贝到str2CString(LPCTSTR lpch, intnLength);将字符串lpch中的前nLength个字符拷贝到该CString对象。
cstring方法
cstring方法在C++中,字符串是一种非常重要的数据类型,广泛应用于各种场景中。
为了方便处理字符串,C++提供了一些常见的字符串操作函数,其中最常用的就是cstring方法了。
在本篇文章中,我们将详细介绍cstring方法的使用方法。
一、cstring方法概述cstring是C++标准库中定义的一个字符串操作库,包括了各种字符串操作函数,如字符串复制strcpy、字符串合并strcat、字符串长度strlen等。
cstring库有时也称为C-string库,因其支持C风格的字符串操作。
cstring库是头文件<string.h>的一个子集,实际上只包含了C-style字符串(以null字符结尾)的函数操作。
二、使用cstring方法进行字符串复制在C++中,字符串复制是一个非常常用的操作,我们称之为strcpy。
下面是strcpy的使用方法:char str1[] = "Hello, world!";char str2[50];strcpy(str2, str1); // 复制 str1 到 str2cout << "str1: " << str1 << endl;cout << "str2: " << str2 << endl;输出:str1: Hello, world! str2: Hello, world!上面的代码中,我们首先声明了两个字符串,一个是str1,另一个是str2。
然后使用strcpy函数将str1复制到str2中。
最后通过cout语句输出了str1和str2的值。
三、使用cstring方法进行字符串合并字符串合并是另一个常见的操作,我们称之为strcat。
下面是strcat的使用方法:char str1[50] = "Hello";char str2[50] = "World";strcat(str1, str2);cout << "str1: " << str1 << endl;cout << "str2: " << str2 << endl;输出:str1: HelloWorld str2: World在上面的代码中,我们首先声明了两个字符串,然后使用strcat 函数将str2中的内容追加到str1的末尾。
CString的Format方法使用技巧小结
CString的Format方法使用技巧小结CString类是MFC(Microsoft Foundation Classes)中提供的一个用于处理字符串的类,它封装了许多字符串处理的功能,其中包括Format方法。
Format方法可以将格式化的字符串输出到CString对象中,类似于C语言中的printf函数。
在本文中,我将总结一些使用CString的Format方法的技巧。
1.格式化字符串中的占位符:在格式化字符串中,可以使用占位符来表示需要被替换的值。
常用的占位符有:%d(整数)、%f(浮点数)、%s(字符串)、%c(字符)等。
例如:````str.Format("The value is %d", 10);```输出的结果为:"The value is 10"。
2.多个占位符:在格式化字符串中,可以使用多个占位符来表示多个需要被替换的值。
例如:````str.Format("The values are %d and %d", 10, 20);```输出的结果为:"The values are 10 and 20"。
3.格式化字符串中的转义字符:在格式化字符串中,可以使用转义字符来表示一些特殊字符。
常用的转义字符有:\n(换行符)、\t(制表符)、\\(反斜杠)等。
例如:````str.Format("This is a newline\nThis is a tab\tThis is a backslash\\");```输出的结果为:````This is a newlineThis is a tab This is a backslash\```4.格式化字符串中的宽度和精度:在格式化字符串中,可以使用宽度和精度来控制输出的格式。
宽度表示输出的最小字符数,精度表示浮点数的小数位数。
例如:```````输出的结果为:"The value is 3.14"。
Cstring字符串比较方法详解
Cstring字符串比较方法详解字符串可以和类型相同的字符串相比较,也可以和具有同样字符类型的数组比较。
Basic_string 类模板既提供了 >、<、==、>=、<=、!= 等比较运算符,还提供了 compare() 函数,其中 compare() 函数支持多参数处理,支持用索引值和长度定位子串进行比较。
该函数返回一个整数来表示比较结果。
如果相比较的两个子串相同,compare() 函数返回0,否则返回非零值。
compare()函数类 basic_string 的成员函数 compare() 的原型如下:int compare (const basic_string& s) const;int compare (const Ch* p) const;int compare (size_type pos, size_type n, const basic_string& s) const;int compare (size_type pos, size_type n, const basic_string& s,size_type pos2, size_type n2) const;int compare (size_type pos, size_type n, const Ch* p, size_type = npos) const;如果在使用compare() 函数时,参数中出现了位置和大小,比较时只能用指定的子串。
例如:pare {pos,n, s2);若参与比较的两个串值相同,则函数返回0;若字符串S 按字典顺序要先于S2,则返回负值;反之,则返回正值。
下面举例说明如何使用 string 类的 compare() 函数。
【例 1】复制纯文本复制1.#include <iostream>2.#include <string>3.u sin g namespace std;4.int main ()5.{6.string A ('aBcdef');7.string B ('AbcdEf');8.string C ('123456');9.string D ('123dfg');10.//下面是各种比较方法11.int m=pare (B); //完整的A和B的比较12.int n=pare(1,5,B,4,2); //'Bcdef'和'AbcdEf'比较13.int p=pare(1,5,B,4,2); //'Bcdef'和'Ef'比较14.int q=pare(0,3,D,0,3); //'123'和'123'比较15.cout << 'm = ' << m << ', n = ' << n <<', p = ' << p << ', q = ' << q << endl;16.cin.get();17.return 0;18.}#include <iostream> #include <string> u sin g namespace std; int main () { string A ('aBcdef'); string B ('AbcdEf'); string C ('123456'); string D ('123dfg'); //下面是各种比较方法int m=pare (B); //完整的A和B的比较int n=pare(1,5,B,4,2); //'Bcdef'和'AbcdEf'比较int p=pare(1,5,B,4,2); //'Bcdef'和'Ef'比较int q=pare(0,3,D,0,3); //'123'和'123'比较 cout << 'm = ' << m << ', n = ' << n <<', p = ' << p << ', q = ' << q << endl; cin.get(); return 0; }程序的执行结果为:m = 1, n = -1, p = -1, q = 0由此可知,string 类的比较 compare() 函数使用非常方便,而且能区分字母的大小写。
cstring头文件例题
cstring头文件例题摘要:一、CString头文件简介1.CString的定义2.CString与字符串的关系3.CString头文件的包含二、CString常用函数1.CString的构造函数2.CString的拷贝构造函数3.CString的赋值函数4.CString的连接函数5.CString的查找函数6.CString的替换函数7.CString的比较函数8.CString的长度函数9.CString的访问与修改三、CString应用实例1.CString的简单应用2.CString的复杂应用正文:CString头文件是C++编程中经常使用的一个头文件,它提供了C++中字符串的操作功能。
CString是C++中的一种字符串类型,它与C语言中的字符串有所不同,CString可以动态地分配和释放内存,同时可以对字符串进行操作。
一、CString头文件简介CString的定义在CString头文件中,它是一种模板类,定义如下:```cpptemplate <class T>class CString {public:CString();CString(const T* psz);CString(const CString& str);~CString();CString& operator=(const CString& str);CString& operator=(const T* psz);int GetLength() const;void Release();void Attach(const T* psz);const T* GetBuffer() const;T* GetBuffer(size_t nLength);private:T* m_pch;int m_nLength;int m_nMaxLength;};```CString与字符串的关系是CString是字符串的一种实现方式,它可以动态地分配和释放内存,同时可以对字符串进行操作。
深入解析MFC -- CString的内存结构
深入解析MFC -- CString的内存结构分类:C++ 2009-06-30 19:40 2173人阅读评论(0) 收藏举报mfcnullclassstringcharacterreferenceVC6的时候记得看过CString的源代码,并不复杂,应该是从VC7开始,MFC和ATL共用一个CString 了,新的CString使用了模板技术和其它技术,值得一提。
先看CString的定义:typedef CAtlString CString;如果想明确使用ANSI和UNICODE版本,可以使用CStringA和CStringW,看它们的定义:typedef CAtlStringW CStringW;typedef CAtlStringA CStringA;以上三个Atl版本的String,其定义为:typedef CStringT< wchar_t, StrTraitATL< wchar_t > > CAtlStringW;typedef CStringT< char, StrTraitATL< char > > CAtlStringA;typedef CStringT< TCHAR, StrTraitATL< TCHAR > > CAtlString;因此,CStringT才是真实的CString类。
template< typename BaseType, class StringTraits >class CStringT :public CSimpleStringT< BaseType, _CSTRING_IMPL_::_MFCDLLTraitsCheck<BaseType, StringTraits>::c_bIsMFCDLLTraits >{};CStringT有两个模板参数,第一个表明字符类型,第二个参数从源代码中知道是StrTraitATL:template< typename _BaseType = char, class StringIterator = ChTraitsOS< _BaseType > >class StrTraitATL : public StringIterator{public:static HINSTANCE FindStringResourceInstance(__in UINT nID) throw(){return( AtlFindStringResourceInstance( nID ) );}static IAtlStringMgr* GetDefaultManager() throw(){return( &g_strmgr );}};从类声明看到他提供了一个字符串管理器,字符迭代器和从资源中获得字符串的功能。
CString的GetBuffer用法,GetBuffer本质,GetBuffer常见问题解决方法
CString的GetBuffer用法,GetBuffer本质,GetBuffer常见问题解决方法char *GetBuffer(n)当n大于0时,是为CString变量分配一个长度为n的字节数组,返回值是这个数组的地址当n等于0时,返回CString变量本身拥有的字符串数组的头ReleaseBuffer一般用在GetBuffer,因为在调用了GetBuffer后变量本身会给自己上锁,于是所有能改变自身值的函数都不能用(如果Left,Mid),要用ReleaseBuffer解锁一.函数原型CString::GetBufferLPTSTR GetBuffer( int nMinBufLength );throw( CMemoryException );Return ValueAn LPTSTR pointer to the object’s (null-terminated) character buffer.ParametersnMinBufLengthThe minimum size of the character buffer in characters. This value does not include space for a null terminator.RemarksReturns a pointer to the internal character buffer for the CString object. The returned LPTSTR is not const and thus allows direct modification of CString contents.If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.二.函数作用及使用范围对一个CString变量,你可以使用的唯一合法转换符是LPCTSTR,直接转换成非常量指针(LPTSTR-[const] char*)是错误的。
cstring的right函数
cstring的right函数cstring的right函数是一个用于截取字符串右侧字符的函数。
它可以根据指定的长度参数,返回原始字符串中右侧的一部分字符。
让我们来看一个具体的例子来解释right函数的使用方法。
假设我们有一个字符串"Hello, World!",我们想要截取右侧的5个字符,那么我们可以这样使用right函数:right("Hello, World!", 5),其返回值将是"orld!"。
接下来,让我们来详细说明一下right函数的用法和注意事项。
1. 函数名称:right2. 参数:- 字符串:需要截取右侧字符的原始字符串。
- 长度:要截取的右侧字符的长度。
3. 返回值:截取的右侧字符。
4. 示例:- right("Hello, World!", 5) 返回值为"orld!"- right("12345", 3) 返回值为"345"需要注意的是,right函数会从原始字符串的右侧开始截取字符。
如果指定的长度大于原始字符串的长度,函数将返回整个原始字符串。
在实际应用中,right函数可以用于截取文件的扩展名、手机号码的后4位等等。
它提供了一种简便的方式来获取字符串右侧的一部分字符。
总结一下,cstring的right函数是一个用于截取字符串右侧字符的函数,它可以根据指定的长度参数,返回原始字符串中右侧的一部分字符。
在使用时,需要注意参数的正确性,并根据具体需求进行调整。
希望本文能够帮助你更好地理解和使用right函数。
cstring 字符串默认长度
cstring 字符串默认长度Cstring 字符串默认长度Cstring 是一种字符串类,在很多编程语言中都有相关实现。
在使用Cstring 类时,默认长度是一个重要的特性。
本文将探讨Cstring 字符串默认长度的相关内容。
一、什么是 Cstring 字符串默认长度?在 Cstring 类中,字符串的默认长度是指字符串对象在被创建时所能容纳的字符个数。
这个长度是在对象创建时被分配的内存空间大小。
默认长度的设定对于字符串的操作和处理有重要影响,因此需要了解和熟悉默认长度的相关知识。
二、默认长度的设定与字符串操作的关系Cstring 类中的字符串对象可以进行各种操作,如赋值、连接、查找、替换等。
在进行这些操作时,字符串的默认长度会影响到操作的有效性和效率。
1. 赋值操作:当将一个较长的字符串赋值给一个默认长度较小的字符串对象时,如果超出了默认长度,可能会导致截断或内存溢出的问题。
因此在进行字符串赋值时,需要注意字符串的长度是否超过了默认长度。
2. 连接操作:将两个字符串连接起来,形成一个新的字符串。
如果连接后的字符串长度超过了默认长度,也会产生截断或溢出的问题。
因此在进行字符串连接操作时,需要预先判断连接后的长度是否超过了默认长度。
3. 查找操作:在字符串中查找某个字符或子串的位置。
如果查找的字符或子串超出了默认长度,可能会导致查找失败或返回错误的位置。
因此在进行字符串查找操作时,需要确保查找的范围不超过默认长度。
4. 替换操作:将字符串中的某个字符或子串替换为另一个字符或子串。
如果替换的字符或子串超出了默认长度,可能会导致替换失败或产生错误结果。
因此在进行字符串替换操作时,需要确保替换的范围不超过默认长度。
三、合理设置默认长度的重要性合理设置字符串的默认长度对于程序的性能和稳定性非常重要。
1. 性能:如果默认长度过小,会导致频繁的内存分配和释放,增加了程序的开销。
而如果默认长度过大,会浪费内存资源。
CString的使用
CString的使⽤⾸先理清⼀下CString的基本概念CString就是对⼀个⽤来存放字符串的缓冲区和对施加于这个字符串的操作封装。
也就是说,CString⾥需要有⼀个⽤来存放字符串的缓冲区,并且有⼀个指针指向该缓冲区,该指针就是LPTSTR m_pchData。
但是有些字符串操作会增建或减少字符串的长度,因此为了减少频繁的申请内存或者释放内存,CString会先申请⼀个⼤的内存块⽤来存放字符串。
这样,以后当字符串长度增长时,如果增加的总长度不超过预先申请的内存块的长度,就不⽤再申请内存。
当增加后的字符串长度超过预先申请的内存时,CString先释放原先的内存,然后再重新申请⼀个更⼤的内存块。
同样的,当字符串长度减少时,也不释放多出来的内存空间。
⽽是等到积累到⼀定程度时,才⼀次性将多余的内存释放。
还有,当使⽤⼀个CString对象a来初始化另⼀个CString对象b时,为了节省空间,新对象b并不分配空间,它所要做的只是将⾃⼰的指针指向对象a的那块内存空间,只有当需要修改对象a或者b中的字符串时,才会为新对象b申请内存空间,这叫做写⼊复制技术(CopyBeforeWrite)。
那么CString是否和我们平时常见的字符串空间⼀样呢?答案是否定的,上⾯说了,变量之间赋值是不会⽴刻分配空间的,除⾮⼀个变量内容发⽣变化,否则只是引⽤技术增加。
我么看了CString结构体的定义之后会更加明⽩这个问题struct CStringData{long nRefs; // 引⽤计数int nDataLength; // 实际数据的长度包括结束符int nAllocLength; // 总共分配的内存空间// TCHAR data[nAllocLength]TCHAR* data() // TCHAR* to managed data{ return (TCHAR*)(this+1); }};看了这个结构,我想对于上⾯的叙述应该觉得本该如此了吧。
vc中CString对象的GetBuffer()用法小结
vc中CString对象的GetBuffer()用法小结1.GetBuffer函数说明这个函数是为一个CString对象重新获取其内部字符缓冲区的指针,返回的LPTSTR为非const的,从而允许直接修改CString中的内容。
如果nMinBufLength(最小占用长度)比当前buffer长度大,那么就调用GetBuffer函数去释放当前的Buffer,用一个被请求的大小去覆盖这个buffer并且重新设定计数器为0,如果在这之前你在这个buffer中调用了LockBuffer,那么你将失去你当前锁定的buffer。
注意事项:如果你使用这个指向由GetBuffer所改变返回的字符串内容,那么在你使用CString其他CString方法之前你必须调用ReleaseBuffer在调用ReleaseBuffer函数之后GetBuffer中的内容将无效(也就是销毁)当这个CString被销毁的时候,这个buffer所占用的内存将被自动释放注意这个: 如果你知道了这个字符串的长度,你不可以直接添加NULL字符了事,当你使用ReleaseBuffer的时候,无论如何,你必须指定最后的字符串的长度,如果你仅仅添加了一个NULL字符结束符给这个字符串,你应该给ReleaseBuffer传递一个-1,当这个函数结束的时候,_tcslen 将决定这个buffer的长度GetBuffer(0):意思是将字符串对象原样返回指针,不改变大小2.使用例子例子:// example for CString::GetBufferCString s( "abcd" );//定义一个CString s并且初始化为abcd#ifdef _DEBUGafxDump << "CString s " << s << "\n";#endifLPTSTR p = s.GetBuffer( 10 );//定义一个指针指向LPTSTR并接受GetBuffer所返回的地址lstrcpy( p, _T("Hello") ); // directly access CString buffer//使用Istrcpy将Hello]复制到该buffer中s.ReleaseBuffer( );//释放buffer#ifdef _DEBUGafxDump << "CString s " << s << "\n";这时候s="Hello";#endif。
cstring的头函数
cstring的头函数Cstring是一个在C++编程语言中用于处理字符串的头文件。
它提供了一系列函数来处理字符数组(字符串),包括拷贝、连接、比较、查找等操作。
本篇文章将详细介绍Cstring头文件的各种函数,并给出具体的使用示例。
1. strlen函数strlen函数用于获取字符串的长度。
它的原型如下:c++size_t strlen(const char *str);该函数接收一个指向字符串的指针,并返回该字符串的长度。
例如,下面是一个使用strlen函数来获取字符串长度的示例:c++#include <cstring>#include <iostream>int main() {const char *str = "Hello, world!";size_t len = strlen(str);std::cout << "字符串长度为:" << len << std::endl;return 0;}运行结果:字符串长度为:132. strcpy函数strcpy函数用于将一个字符串拷贝到另一个字符串中。
它的原型如下:c++char *strcpy(char *destination, const char *source);该函数接收两个参数,第一个参数是目标字符串的指针,第二个参数是源字符串的指针。
它会将源字符串的内容拷贝到目标字符串中,并返回目标字符串的指针。
下面是一个使用strcpy函数来拷贝字符串的示例:c++#include <cstring>#include <iostream>int main() {const char *source = "Hello, world!";char destination[20];strcpy(destination, source);std::cout << "拷贝后的字符串为:" << destination << std::endl;return 0;}运行结果:拷贝后的字符串为:Hello, world!3. strcat函数strcat函数用于将两个字符串连接起来。
c++cstring用法
在C++中,`cstring`是一个包含C风格字符串操作的库。
C风格字符串是指以空字符`\0`结尾的字符数组。
`cstring`库提供了一系列函数来操作这种类型的字符串。
下面是一些常用的`cstring`函数:1. `memcmp()`: 用于比较内存区域的内容。
2. `memcpy()`: 用于复制内存区域的内容。
3. `strcat()`: 用于连接两个C风格字符串。
4. `strncat()`: 用于连接两个C风格字符串,并指定最大的复制字符数。
5. `strcmp()`: 用于比较两个C风格字符串。
6. `strncmp()`: 用于比较两个C风格字符串,并指定最大的复制字符数。
7. `strchr()`: 用于查找指定字符在字符串中第一次出现的位置。
8. `strrchr()`: 用于查找指定字符在字符串中最后一次出现的位置。
9. `strpbrk()`: 用于查找一组字符中任意一个在字符串中出现的位置。
10. `strspn()`: 用于查找字符串中第一个出现的空白字符(如空格、制表符或换行符)的位置。
11. `strstr()`: 用于查找子字符串在主字符串中第一次出现的位置。
12. `strtok()`: 用于分割字符串,将字符串分解为一系列由特定分隔符分隔的标记。
这些函数的使用方法如下:* `memcpy(dst, src, size)`: 将`src`指向的内存区域的前`size`个字节复制到`dst`指向的内存区域。
* `strcat(dest, src)`: 将`src`指向的字符串连接到`dest`指向的字符串的结尾,并添加一个空字符来标记新字符串的结尾。
* `strcmp(str1, str2)`: 比较`str1`和`str2`指向的字符串,如果它们相等,则返回0;如果`str1`小于`str2`,则返回一个负数;如果`str1`大于`str2`,则返回一个正数。
* `strtok(str, delim)`: 根据指定的分隔符`delim`将`str`指向的字符串分割为一系列标记,并返回指向第一个标记的指针。
CString的Format方法使用技巧小结(大全)
CString的Format方法使用技巧小结(大全)第一篇:CString的Format方法使用技巧小结(大全)CString的Format方法使用技巧小结在VC中经常用到Format()来输出一个特定类型的变量到窗口上,该函数使用起来比较方便,但是如果对其函数中的参数不很熟悉的话用起来也是比较麻烦的。
因此,归纳了一下,以供大家查询之用:1).格式说明格式说明总是以%字符开始,以不同类型数据的格式方式%号: %d 输出带符号十进制数 %o输出无符号八进制数 %x输出无符号十六进制数 %u输出无符号数 %c输出单个字符 %s输出一串字符 %f输出实数(6位小数)%e以指数形式输出实数%g选用f与e格式中输出宽度较小的格式,不输出0 %ld输入输出long型数据%lf输入输出double型数据m.n中,m为数据输出宽度,n为输出小数位数比如常见的int、float和double这些数字类型转换为CString字符串只需一行代码就可以实现。
1、int转换为CString:CString str;int number=15;//str=“15” str.Format(_T(“%d”),number);//str=“ 15”(前面有两个空格;4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)str.Format(_T(“%4d”),number);//str=“0015”(.4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)str.Format(_T(“%.4d”),number);long转换为CString的方法与上面相似,只需要把%d改为%ld 就可以了。
2、double转换为CString:CString str;double num=1.46;//str=“1.46” str.Format(_T(“%lf”),num);//str=“1.5”(.1表示小数点后留1位,小数点后超过1位则四舍五入)str.Format(_T(“%.1lf”),num);//str=“1.4600” str.Format(_T(“%.4f”),num);//str=“ 1.4600”(前面有1个空格)str.Format(_T(“%7.4f”),num);float转换为CString的方法也同上面相似,将lf%改为f%就可以了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于CString总结作者:wangshengxiang前言:串操作是编程中最常用也最基本的操作之一。
做为VC程序员,无论是菜鸟或高手都曾用过Cstring。
而且好像实际编程中很难离得开它(虽然它不是标准C++中的库)。
因为MFC中提供的这个类对我们操作字串实在太方便了,CString不仅提供各种丰富的操作函数、操作符重载,使我们使用起串起来更象basic中那样直观;而且它还提供了动态内存分配,使我们减少了多少字符串数组越界的隐患。
但是,我们在使用过程中也体会到CString简直太容易出错了,而且有的不可捉摸。
所以有许多高人站过来,建议抛弃它。
在此,我个人认为:CString封装得确实很完美,它有许多优点,如“容易使用,功能强,动态分配内存,大量进行拷贝时它很能节省内存资源并且执行效率高,与标准C完全兼容,同时支持多字节与宽字节,由于有异常机制所以使用它安全方便”其实,使用过程中之所以容易出错,那是因为我们对它了解得还不够,特别是它的实现机制。
因为我们中的大多数人,在工作中并不那么爱深入地去看关于它的文档,何况它还是英文的。
由于前几天我在工作中遇到了一个本不是问题但却特别棘手、特别难解决而且莫名惊诧的问题。
好来最后发现是由于CString引发的。
所以没办法,我把整个CString的实现全部看了一遍,才慌然大悟,并彻底弄清了问题的原因(这个问题,我已在csdn上开贴)。
在此,我想把我的一些关于CString的知识总结一番,以供他(她)人借鉴,也许其中有我理解上的错误,望发现者能通知我,不胜感谢。
1. CString实现的机制.CString是通过“引用”来管理串的,“引用”这个词我相信大家并不陌生,象Window内核对象、COM对象等都是通过引用来实现的。
而CString也是通过这样的机制来管理分配的内存块。
实际上CString对象只有一个指针成员变量,所以任何CString实例的长度只有4字节.即: int len = sizeof(CString);//len等于4这个指针指向一个相关的引用内存块,如图: CString str("abcd");‘A’‘B’‘C’‘D’0x04040404 head部,为引用内存块相关信息str 0x40404040正因为如此,一个这样的内存块可被多个CString所引用,例如下列代码:CString str("abcd");CString a = str;CString b(str);CString c;c = b;上面代码的结果是:上面四个对象(str,a,b,c)中的成员变量指针有相同的值,都为0x40404040.而这块内存块怎么知道有多少个CString引用它呢?同样,它也会记录一些信息。
如被引用数,串长度,分配内存长度。
这块引用内存块的结构定义如下:struct CStringData{long nRefs; //表示有多少个CString 引用它. 4int nDataLength; //串实际长度. 4int nAllocLength; //总共分配的内存长度(不计这头部的12字节). 4};由于有了这些信息,CString就能正确地分配、管理、释放引用内存块。
如果你想在调试程序的时候获得这些信息。
可以在Watch窗口键入下列表达式:(CStringData*)((CStringData*)(this->m_pchData)-1)或(CStringData*)((CStringData*)(str.m_pchData)-1)//str为指CString实例正因为采用了这样的好机制,使得CString在大量拷贝时,不仅效率高,而且分配内存少。
2.LPCTSTR 与 GetBuffer(int nMinBufLength)这两个函数提供了与标准C的兼容转换。
在实际中使用频率很高,但却是最容易出错的地方。
这两个函数实际上返回的都是指针,但它们有何区别呢?以及调用它们后,幕后是做了怎样的处理过程呢?(1) LPCTSTR 它的执行过程其实很简单,只是返回引用内存块的串地址。
它是作为操作符重载提供的,所以在代码中有时可以隐式转换,而有时却需强制转制。
如:CString str;const char* p = (LPCTSTR)str;//假设有这样的一个函数,Test(const char* p);你就可以这样调用Test(str);//这里会隐式转换为LPCTSTR(2) GetBuffer(int nMinBufLength) 它类似,也会返回一个指针,不过它有点差别,返回的是LPTSTR(3) 这两者到底有何不同呢?我想告诉大家,其本质上完全不一样,一般说LPCTSTR转换后只应该当常量使用,或者做函数的入参;而GetBuffer(...)取出指针后,可以通过这个指针来修改里面的内容,或者做函数的出参。
为什么呢?也许经常有这样的代码:CString str("abcd");char* p = (char*)(const char*)str;p[2] = 'z';其实,也许有这样的代码后,你的程序并没有错,而且程序也运行得挺好。
但它却是非常危险的。
再看CString str("abcd");CString test = str;....char* p = (char*)(const char*)str;p[2] = 'z';strcpy(p, "akfjaksjfakfakfakj");//这下完蛋了你知道此时,test中的值是多少吗?答案是"abzd"。
它也跟着改变了,这不是你所期望发生的。
但为什么会这样呢?你稍微想想就会明白,前面说过,因为CString是指向引用块的,str与test指向同一块地方,当你p[2]='z'后,当然test也会随着改变。
所以用它做LPCTSTR做转换后,你只能去读这块数据,千万别去改变它的内容。
假如我想直接通过指针去修改数据的话,那怎样办呢?就是用GetBuffer(...).看下述代码:CString str("abcd");CString test = str;....char* p = str.GetBuffer(20);p[2] = 'z'; // 执行到此,现在test中值却仍是"abcd"strcpy(p, "akfjaksjfakfakfakj"); // 执行到此,现在test 中值还是"abcd"为什么会这样?其实GetBuffer(20)调用时,它实际上另外建立了一块新内块存,并分配20字节长度的buffer,而原来的内存块引用计数也相应减1. 所以执行代码后str与test是指向了两块不同的地方,所以相安无事。
(4) 不过这里还有一点注意事项:就是str.GetBuffer(20)后,str的分配长度为20,即指针p它所指向的buffer只有20字节长,给它赋值时,切不可超过,否则灾难离你不远了;如果指定长度小于原来串长度,如GetBuffer(1),实际上它会分配4个字节长度(即原来串长度);另外,当调用GetBuffer(...)后并改变其内容,一定要记得调用ReleaseBuffer(),这个函数会根据串内容来更新引用内存块的头部信息。
(5) 最后还有一注意事项,看下述代码:char* p = NULL;const char* q = NULL;{CString str = "abcd";q = (LPCTSTR)str;p = str.GetBuffer(20);AfxMessageBox(q);// 合法的strcpy(p, "this is test");//合法的,}AfxMessageBox(q);// 非法的,可能完蛋strcpy(p, "this is test");//非法的,可能完蛋这里要说的就是,当返回这些指针后,如果CString对象生命结束,这些指针也相应无效。
3.拷贝 & 赋值 & "引用内存块" 什么时候释放?下面演示一段代码执行过程void Test(){CString str("abcd");//str指向一引用内存块(引用内存块的引用计数为1,长度为4,分配长度为4)CString a;//a指向一初始数据状态,a = str;//a与str指向同一引用内存块(引用内存块的引用计数为2,长度为4,分配长度为4)CString b(a);//a、b与str指向同一引用内存块(引用内存块的引用计数为3,长度为4,分配长度为4){LPCTSTR temp = (LPCTSTR)a;//temp指向引用内存块的串首地址。
(引用内存块的引用计数为3,长度为4,分配长度为4)CString d = a;//a、b、d与str指向同一引用内存块(引用内存块的引用计数为4, 长度为4,分配长度为4)b = "testa";//这条语句实际是调用CString::operator=(CString&)函数。
b指向一新分配的引用内存块。
(新分配的引用内存块的引用计数为1, 长度为5,分配长度为5)//同时原引用内存块引用计数减1. a、d与str仍指向原引用内存块(引用内存块的引用计数为3,长度为4,分配长度为4)}//由于d生命结束,调用析构函数,导至引用计数减1(引用内存块的引用计数为2,长度为4,分配长度为4)LPTSTR temp = a.GetBuffer(10);//此语句也会导致重新分配新内存块。
temp指向新分配引用内存块的串首地址(新分配的引用内存块的引用计数为1,长度为0,分配长度为10)//同时原引用内存块引用计数减1. 只有str仍指向原引用内存块(引用内存块的引用计数为1, 长度为4, 分配长度为4)strcpy(temp, "temp");//a指向的引用内存块的引用计数为1,长度为0,分配长度为10a.ReleaseBuffer();//注意:a指向的引用内存块的引用计数为1,长度为4,分配长度为10}//执行到此,所有的局部变量生命周期都已结束。
对象str a b 各自调用自己的析构构//函数,所指向的引用内存块也相应减1//注意,str a b 所分别指向的引用内存块的计数均为0,这导致所分配的内存块释放通过观察上面执行过程,我们会发现CString虽然可以多个对象指向同一引用内块存,但是它们在进行各种拷贝、赋值及改变串内容时,它的处理是很智能并且非常安全的,完全做到了互不干涉、互不影响。