CString 操作指南
- 格式:docx
- 大小:64.92 KB
- 文档页数:24
在C++中,`cstring`是一个库,其中包含一些用于处理C风格字符串(以null结尾的字符数组)的函数。
在许多方面,它们与标准库中的`string`类一起使用的方法类似。
下面是一些常见的`cstring`函数的使用方法:1. `memcmp`: 这个函数可以比较两个内存区域的内容。
它接受两个指向内存区域的指针和要比较的字节数。
```cpp#include <cstring>int main() {char str1[] = "Hello";char str2[] = "Hello";if (std::memcmp(str1, str2, 5) == 0) {std::cout << "The first five characters are the same." << std::endl;} else {std::cout << "The first five characters are not the same."<< std::endl;}return 0;}```2. `memcpy`: 这个函数用于将一段内存的内容复制到另一段内存。
它接受三个参数:目标内存区域的指针,源内存区域的指针,以及要复制的字节数。
```cpp#include <cstring>int main() {char str1[100] = "Hello";char str2[100];std::memcpy(str2, str1, 5);str2[5] = '\0'; // Don't forget the null terminator!std::cout << str2 << std::endl; // Prints "Hello"return 0;}```3. `strlen`: 这个函数用于获取C风格字符串的长度。
cstring 加法-回复CString是C++中的一个字符串类,用于处理字符串操作。
它拥有许多内置的字符串操作函数,其中包括字符串加法操作。
在本文中,我将详细解释CString的加法操作,并提供一些示例代码来说明它的使用。
在开始之前,让我们先熟悉一下CString类。
CString类是MFC(Microsoft Foundation Class)库中的一个重要组件。
它提供了一种易于使用的方法来处理字符串,其功能相对于C风格的字符串更加强大和方便。
CString 类中包含了许多成员函数,其中包括加法操作符“+”用于字符串连接。
CString类允许我们将两个字符串连接起来形成一个新的字符串。
这个过程很简单,只需要使用"+"操作符将两个字符串放在一起即可。
下面是一个示例代码,演示了如何使用CString类进行字符串加法操作:cpp#include <iostream>#include <afx.h> 引入CString类头文件int main() {CString str1 = "Hello";CString str2 = " World!";CString str3 = str1 + str2;std::cout << str3.GetString(); 输出:Hello World!return 0;}在上面的示例中,我们首先包含了"afx.h"头文件,这是MFC库中的一个重要头文件,其中包含了CString类的定义。
然后,我们声明了三个CString 对象:str1,str2和str3。
str1和str2分别初始化为"Hello"和" World!",而str3则是通过将str1和str2连接起来而得到的结果。
在将str1和str2相加时,我们使用了"+"操作符。
一 CString ,BSTR ,LPCTSTR之间关系和区别CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。
CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。
typedef OLECHAR FAR* BSTR;typedef const char * LPCTSTR;二vc++中各种字符串的表示法char* :是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
LP:表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.LPSTR: 是一个指向以…\0‟结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。
LPCSTR: 增加的…C‟的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
TCHAR: 在采用Unicode方式编译时是wchar_t,在普通时编译成char. 如果定义_UNICODE,声明如:typedef wchar_t TCHAR;如果没有定义_UNICODE,则声明如:typedef char TCHAR;LPTSTR和LPCTSTR:中的含义就是每个字符是这样的TCHAR。
LPCTSTR:#ifdef _UNICODEtypedef const wchar_t * LPCTSTR;#elsetypedef const char * LPCTSTR;#endifLPWSTR与LPCWSTR:类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t 而不是char。
Unicode标准: 它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
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函数来比较两个字符串的大小关系。
在C++中,cstring库(或称为<cstring>头文件)提供了一组函数来处理C风格的字符串,也就是以空字符(\0)结尾的字符数组。
然而,这个库并没有直接提供字符串加法(连接)的功能。
要进行字符串的加法操作,你通常会使用C++标准库中的std::string类,它支持字符串的连接操作。
下面是一个使用std::string进行字符串加法的简单示例:cpp#include <iostream>#include <string>int main() {std::string str1 = "Hello, ";std::string str2 = "world!";std::string result = str1 + str2; // 字符串加法std::cout << result << std::endl; // 输出:Hello, world!return 0;}如果你确实需要使用cstring库,并且要执行字符串连接,那么你需要手动分配足够的内存来存储两个字符串的内容,并使用例如strcat函数来执行连接。
这是一个示例:cpp#include <iostream>#include <cstring>int main() {const char* str1 = "Hello, ";const char* str2 = "world!";char result[50]; // 分配足够的内存来存储连接后的字符串strcpy(result, str1); // 将str1复制到result中strcat(result, str2); // 将str2连接到result的末尾std::cout << result << std::endl; // 输出:Hello, world!return 0;}请注意,在使用cstring函数时需要特别小心,因为它们不会检查数组边界,这可能导致缓冲区溢出和其他安全问题。
CString字符串查找和截取本文总结CString Left()、Mid()、Right()以及几个跟CString字符串查找相关的函数使用,首先需要查找,CString里有如下几个查找函数,分别为Find()、ReverseFind()、FindOneOf()。
一、CString之Find()、FindOneOf()、ReverseFind()此三个函数返回值均为整数int。
1、Find()该函数从左侧0索引开始,查找第一个出现的字符位置,返回position。
示例如下:1CString s( "abcd" );2ASSERT( s.Find( 'b' ) == 1 );返回值:•如果查到,返回以0索引起始的位置•未查到,返回-12、FindOneOf()给定一字符串,然后查找其中出现的第一个字符位置,示例如下:1CString s( "abcdef" );2ASSERT( s.FindOneOf( "zb" ) == 1 );返回值:•如果查到,返回以0索引起始的位置•未查到,返回-13、ReverseFind()该函数反向查找字符出现的位置。
示例如下:1CString s( "abcd" );2ASSERT( s.ReverseFind( 'b' ) == 2 );返回值:•如果查到,返回以0索引起始的位置•未查到,返回-1二、CString之Left()、Mid()、Right()查找完成后,我们可能需要截取字符串。
CString有如下几个字符串截取函数。
1、Left(int nCount)该函数截取左侧nCount个字符,如果遇到双字节字符(下面Mid 和Right同样理解),比如中文,则可能会截断乱码。
因为nCount是按照字节计数的。
2、Mid(int nFirst)和Mid( int nFirst, int nCount)Mid(int nFirst)函数截取从nFirst开始,直到字符串结束的字符串。
C string CString 详解一转的,觉得很经典!C++string详解[转:前言:string的角色1 string使用1.1充分使用string操作符1.2眼花缭乱的string find函数1.3 string insert,replace,erase 2string和C风格字符串3 string和Charactor Traits 4string建议5小结6附录前言:string的角色C++语言是个十分优秀的语言,但优秀并不表示完美。
还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很不方便。
以前没有接触过其他语言时,每当别人这么说,我总是不屑一顾,认为他们根本就没有领会C++的精华,或者不太懂C++,现在我接触perl,php,和Shell脚本以后,开始理解了以前为什么有人说C++文本处理不方便了。
举例来说,如果文本格式是:用户名电话号码,文件名name.txt Tom 23245332 Jenny 22231231 Heny 22183942 Tom 23245332 .现在我们需要对用户名排序,且只输出不同的姓名。
那么在shell编程中,可以这样用:awk'{print}'name.txt|sort|uniq简单吧?如果使用C/C++就麻烦了,他需要做以下工作:先打开文件,检测文件是否打开,如果失败,则退出。
声明一个足够大得二维字符数组或者一个字符指针数组读入一行到字符空间然后分析一行的结构,找到空格,存入字符数组中。
关闭文件写一个排序函数,或者使用写一个比较函数,使用qsort排序遍历数组,比较是否有相同的,如果有,则要删除,copy.输出信息你可以用C++或者C语言去实现这个流程。
如果一个人的主要工作就是处理这种类似的文本(例如做apache的日志统计和分析),你说他会喜欢C/C++么?当然,有了STL,这些处理会得到很大的简化。
CString是MFC对字符串的封装, 它包含一个可变长的字符序列, 提供了很多串操作, 使用它比使用其他的字符串类型更加方便. CString没有继承任何类.CString中的各个字符都是TCHAR类型的, 它在UNICODE中是16位, 在普通字符集中是8位.CString对象可以随着串合并操作而动态增长其长度,而无须用户来对其长度进行专门设置. 你最好把CString看作一个串类型,而不是一个指向字符串的指针; 但CString可以转换为const char*和LPCTSTR类型, 也就是说, 以const char*和LPCTSTR为参数,也可以以CString 作为参数进行调用.一、CString的构造函数CString类拥有众多的构造函数, 用于以不同的数据类型和不同的方式构造一个字符串对象:CString(); //无参数的构造函数,产生一个空的CString对象CString(const CString& stringSrc); //用另一个CString对象的值初始化对象CString(TCHAR ch, int nRepeat=1);//用一个字符重复若干次来初始化对象CString(LPCTSTR lpch, int nLength);//用一个字符数组和一定长度来初始化对象CString(const unsigned char* psz);//从一个无符号字符指针构造对象CString(LPCWSTR lpsz);//从一个Unicode字符串来构造对象CString(LPCSTR lpsz);//从一个ANSI字符串构造对象可以把某些构造函数看作于类型转化。
下面是一些例子:CString s1;CString s2("big");CString s3 = s2;CString s4(S2 + " " + s3);CString s5(" x"); //s5=" x";CString s6(" x",7); //s6=" xxxxxxx";CString s7((LPCSTR)ID_FILE_NEW); //ID_FILE_NEW是一个资源IDCString city="Beijing";//注意不是同值运算符二、CString的基本操作得到字符串长度:即字符串包含的字符数,用函数GetLength,它返回一个int类型的数。
cstring常用方法CString是MFC中一个常用的类,它封装了常见的C字符串操作函数,提供更加方便的字符操作方式。
本文将分步骤阐述CString常用方法。
一、构造函数创建一个CString对象,需要使用构造函数。
括号里可以传入一个C字符串或者字符个数,使用方式如下:CString str1; // 默认构造函数CString str2("hello,world!"); // 传入C字符串CString str3(str2); // 拷贝构造函数,将str2的值赋给str3 CString str4(5, 'A'); // 构造一个由5个A构成的字符串二、赋值操作CString支持C字符串的赋值操作,也可以通过字符串对象之间的赋值实现,示例如下:CString str("hello");str = "hi"; // 直接使用C字符串赋值CString str1 = "world";CString str2;str2 = str1; // 通过已有字符串对象之间的赋值三、字符串拼接在字符串处理过程中,需要将多个字符串拼接成一个完整的字符串。
CString提供了多种拼接方式,其中最常用的是加号+运算符,示例如下:CString str1 = "hello";CString str2 = "world";CString str3 = str1 + "," + str2;CString str4("!");CString str5 = str3 + str4; // 字符串拼接四、字符串长度和内容CString对象可以通过Length()方法获取其长度,也可以直接访问其m_nLength成员变量,示例如下:CString str("hello");int nLength = str.Length(); // 获取字符串长度另外,CString也可以通过operator[]操作符来访问单个字符,示例如下:CString str("hello");char ch = str[1]; // 获取字符串中第2个字符五、字符串查找在字符串处理过程中,经常需要查找字符串中是否包含某个子串,或者从某个位置开始查找某个字符。
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 操作指南原著:Joseph M. Newcomer翻译:littleloach原文出处:codeproject:CString Management通过阅读本文你可以学习如何有效地使用CString。
CString 是一种很有用的数据类型。
它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多。
不管怎样,使用CString有很多特殊的技巧,特别是对于纯C背景下走出来的程序员来说有点难以学习。
这篇文章就来讨论这些技巧。
使用CString可以让你对字符串的操作更加直截了当。
这篇文章不是CString 的完全手册,但囊括了大部分常见基本问题。
这篇文章包括以下内容:1.CString 对象的连接2.格式化字符串(包括int 型转化为CString )3.CString 型转化成int 型4.CString 型和char* 类型的相互转化5.char* 转化成CString6.CString 转化成char* 之一:使用LPCTSTR强制转化7.CString 转化成char* 之二:使用CString对象的GetBuffer方法8.CString 转化成char* 之三: 和控件的接口9.CString 型转化成BSTR 型;10.BSTR 型转化成CString 型;11.VARIANT 型转化成CString 型;12.载入字符串表资源;13.CString 和临时对象;14.CString 的效率;15.总结下面我分别讨论。
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;s.Format(_T("The total is %d"), total);用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。
格式化是一种把其它不是字符串类型的数据转化为CString类型的最常用技巧,比如,把一个整数转化成CString类型,可用如下方法:CString s;s.Format(_T("%d"), total);我总是对我的字符串使用_T()宏,这是为了让我的代码至少有Unicode的意识,当然,关于Unicode的话题不在这篇文章的讨论范围。
_T()宏在8位字符环境下是如下定义的:#define _T(x) x // 非Unicode版本(non-Unicode version)而在Unicode环境下是如下定义的:#define _T(x) L##x // Unicode版本(Unicode version)所以在Unicode环境下,它的效果就相当于:s.Format(L"%d", total);如果你认为你的程序可能在Unicode的环境下运行,那么开始在意用Unicode 编码。
比如说,不要用sizeof() 操作符来获得字符串的长度,因为在Unicode环境下就会有2倍的误差。
我们可以用一些方法来隐藏Unicode的一些细节,比如在我需要获得字符长度的时候,我会用一个叫做DIM的宏,这个宏是在我的dim.h文件中定义的,我会在我写的所有程序中都包含这个文件:#define DIM(x) ( sizeof((x)) / sizeof((x)[0]) )这个宏不仅可以用来解决Unicode的字符串长度的问题,也可以用在编译时定义的表格上,它可以获得表格的项数,如下:class Whatever { ... };Whatever data[] = {{ ... },...{ ... },};for(int i = 0; i < DIM(data); i++) // 扫描表格寻找匹配项。
这里要提醒你的就是一定要注意那些在参数中需要真实字节数的API函数调用,如果你传递字符个数给它,它将不能正常工作。
如下:TCHAR data[20];lstrcpyn(data, longstring, sizeof(data) - 1); // WRONG! lstrcpyn(data, longstring, DIM(data) - 1); // RIGHTWriteFile(f, data, DIM(data), &bytesWritten, NULL); // WRONG! WriteFile(f, data, sizeof(data), &bytesWritten, NULL); // RIGHT造成以上原因是因为lstrcpyn需要一个字符个数作为参数,但是WriteFile却需要字节数作为参数。
同样需要注意的是有时候需要写出数据的所有内容。
如果你仅仅只想写出数据的真实长度,你可能会认为你应该这样做:WriteFile(f, data, lstrlen(data), &bytesWritten, NULL); // WRONG 但是在Unicode环境下,它不会正常工作。
正确的做法应该是这样:WriteFile(f, data, lstrlen(data) * sizeof(TCHAR), &bytesWritten, NULL); // RIGHT因为WriteFile需要的是一个以字节为单位的长度。
(可能有些人会想“在非Unicode的环境下运行这行代码,就意味着总是在做一个多余的乘1操作,这样不会降低程序的效率吗?”这种想法是多余的,你必须要了解编译器实际上做了什么,没有哪一个C或C++编译器会把这种无聊的乘1操作留在代码中。
在Unicode环境下运行的时候,你也不必担心那个乘2操作会降低程序的效率,记住,这只是一个左移一位的操作而已,编译器也很乐意为你做这种替换。
)使用_T宏并不是意味着你已经创建了一个Unicode的程序,你只是创建了一个有Unicode意识的程序而已。
如果你在默认的8-bit模式下编译你的程序的话,得到的将是一个普通的8-bit的应用程序(这里的8-bit指的只是8位的字符编码,并不是指8位的计算机系统);当你在Unicode环境下编译你的程序时,你才会得到一个Unicode的程序。
记住,CString 在Unicode 环境下,里面包含的可都是16位的字符哦。
3、CString 型转化成int 型把CString 类型的数据转化成整数类型最简单的方法就是使用标准的字符串到整数转换例程。
虽然通常你怀疑使用_atoi()函数是一个好的选择,它也很少会是一个正确的选择。
如果你准备使用Unicode 字符,你应该用_ttoi(),它在ANSI 编码系统中被编译成_atoi(),而在Unicode 编码系统中编译成_wtoi()。
你也可以考虑使用_tcstoul()或者_tcstol(),它们都能把字符串转化成任意进制的长整数(如二进制、八进制、十进制或十六进制),不同点在于前者转化后的数据是无符号的(unsigned),而后者相反。
看下面的例子:CString hex = _T("FAB");CString decimal = _T("4011");ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal));4、CString 型和char* 类型的相互转化这是初学者使用CString 时最常见的问题。
有了C++ 的帮助,很多问题你不需要深入的去考虑它,直接拿来用就行了,但是如果你不能深入了解它的运行机制,又会有很多问题让你迷惑,特别是有些看起来没有问题的代码,却偏偏不能正常工作。
比如,你会奇怪为什么不能写向下面这样的代码呢:CString graycat = "Gray" + "Cat";或者这样:CString graycat("Gray" + "Cat");事实上,编译器将抱怨上面的这些尝试。
为什么呢?因为针对CString 和LPCTSTR数据类型的各种各样的组合,“ +” 运算符被定义成一个重载操作符。
而不是两个LPCTSTR 数据类型,它是底层数据类型。
你不能对基本数据(如int、char 或者char*)类型重载C++ 的运算符。
你可以象下面这样做:CString graycat = CString("Gray") + CString("Cat");或者这样:CString graycat = CString("Gray") + "Cat";研究一番就会发现:“ +”总是使用在至少有一个CString 对象和一个LPCSTR的场合。
注意,编写有Unicode 意识的代码总是一件好事,比如:CString graycat = CString(_T("Gray")) + _T("Cat");这将使得你的代码可以直接移植。
char* 转化为CString现在你有一个char* 类型的数据,或者说一个字符串。
怎么样创建CString 对象呢?这里有一些例子:char * p = "This is a test";或者象下面这样更具有Unicode 意识:TCHAR * p = _T("This is a test")或LPTSTR p = _T("This is a test");你可以使用下面任意一种写法:CString s = "This is a test"; // 8-bit onlyCString s = _T("This is a test"); // Unicode-awareCString s("This is a test"); // 8-bit onlyCString s(_T("This is a test")); // Unicode-awareCString s = p;CString s(p);用这些方法可以轻松将常量字符串或指针转换成CString。