BSTR 、LPCTSTR、CString附C语言串基本操作
c++ cstring用法
在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, 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的含義是長指針(long pointer)。
LPSTR是一個指向以…\0‟結尾的ANSI字元陣列的指標,與char*可以互換使用,在win32中較多地使用LPSTR。
而LPCSTR中增加的…C‟的含義是“CONSTANT”(常量),表明這種資料類型的實例不能被使用它的API 函數改變,除此之外,它與LPSTR是等同的。
1.LP表示長指針,在win16下有長指針(LP)和短指針(P)的區別,而在win32下是沒有區別的,都是32位.所以這裡的LP和P是等價的.2.C表示const3.T是什麼東西呢,我們知道TCHAR在採用Unicode方式編譯時是wchar_t,在普通時編譯成char.為了滿足程式碼國際化的需要,業界推出了Unicode標準,它提供了一種簡單和一致的表達字串的方法,所有字元中的位元組都是16位元的值,其數量也可以滿足差不多世界上所有書面語言字元的編碼需求,開發程式時使用Unicode(類型為wchar_t)是一種被鼓勵的做法。
LPWSTR與LPCWSTR由此產生,它們的含義類似於LPSTR與LPCSTR,只是字元資料是16位元的wchar_t而不是char。
然後為了實現兩種編碼的通用,提出了TCHAR的定義:如果定義_UNICODE,聲明如下:typedef wchar_t TCHAR;如果沒有定義_UNICODE,則聲明如下:typedef char TCHAR;LPTSTR和LPCTSTR中的含義就是每個字元是這樣的TCHAR。
2019年MFC中CString类的用法
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类替你完成。
C语言字符串操作
C语言字符串操作字符串是C语言中最常用的数据类型之一,用于存储和操作文本数据。
在C语言中,有多种操作和处理字符串的方法,能够实现字符串的拼接、替换、截取等功能。
本文将介绍C语言中常用的字符串操作函数,并通过实例演示它们的用法。
1. 字符串长度计算在C语言中,可以使用标准库函数strlen来计算字符串的长度。
其原型如下:```csize_t strlen(const char *str);```其中,str是要计算长度的字符串。
该函数返回的是一个无符号整数,表示字符串的长度,不包括字符串结束符'\0'。
示例:```c#include <stdio.h>#include <string.h>int main() {char str[] = "Hello, world!";int len = strlen(str);printf("字符串的长度是:%d\n", len);return 0;}```输出结果:```字符串的长度是:13```2. 字符串拼接字符串拼接是将多个字符串连接成一个字符串的操作。
在C语言中,可以使用strcat函数实现字符串的拼接。
其原型如下:```cchar *strcat(char *dest, const char *src);```其中,dest是目标字符串,src是要拼接的字符串。
该函数会将src中的内容追加到dest的末尾,并返回dest的地址。
示例:```c#include <stdio.h>#include <string.h>int main() {char str1[20] = "Hello, ";char str2[] = "world!";strcat(str1, str2);printf("拼接后的字符串是:%s\n", str1);return 0;}```输出结果:```拼接后的字符串是:Hello, world!```3. 字符串复制字符串复制是将一个字符串的内容复制到另一个字符串中的操作。
c语言中字符串操作函数及功能
c语言中字符串操作函数及功能C语言中字符串操作函数及功能在C语言中,字符串是一组由字符组成的数据,用于存储和操作文本信息。
C语言提供了许多字符串操作函数,以便开发者能够方便地处理字符串。
本文将介绍一些常用的字符串操作函数及其功能。
1. strlen函数:用于获取字符串的长度。
它接受一个字符串作为参数,并返回该字符串的长度,即字符的个数。
例如,strlen("hello")将返回5。
2. strcpy函数:用于将一个字符串复制到另一个字符串中。
它接受两个参数,第一个参数是目标字符串,第二个参数是源字符串。
例如,strcpy(dest, src)将源字符串src复制到目标字符串dest中。
3. strcat函数:用于将一个字符串连接到另一个字符串的末尾。
它接受两个参数,第一个参数是目标字符串,第二个参数是要追加的字符串。
例如,strcat(dest, src)将字符串src追加到字符串dest的末尾。
4. strcmp函数:用于比较两个字符串。
它接受两个参数,分别是要比较的两个字符串。
如果两个字符串相等,返回0;如果第一个字符串小于第二个字符串,返回负数;如果第一个字符串大于第二个字符串,返回正数。
例如,strcmp("hello", "world")将返回负数。
5. strchr函数:用于在字符串中查找指定字符的第一次出现的位置。
它接受两个参数,第一个参数是要查找的字符串,第二个参数是要查找的字符。
如果找到了指定字符,返回该字符在字符串中的位置;如果未找到,返回NULL。
6. strstr函数:用于在字符串中查找指定子串的第一次出现的位置。
它接受两个参数,第一个参数是要查找的字符串,第二个参数是要查找的子串。
如果找到了指定子串,返回该子串在字符串中的位置;如果未找到,返回NULL。
7. strtok函数:用于将字符串分割为多个子串。
它接受两个参数,第一个参数是要分割的字符串,第二个参数是分割的分隔符。
c语言string类的常用方法
c语言string类的常用方法在C语言中,字符串通常表示为字符数组,而不是像C++中的`std::string`类。
但我们可以使用一些函数来处理字符串,这些函数在``库中定义。
以下是C语言中处理字符串的一些常用方法:1. `strlen()`: 返回字符串的长度,不包括终止字符'\0'。
```csize_t len = strlen("Hello"); // len 为 5```2. `strcpy()`: 将一个字符串复制到另一个字符串。
```cchar src[] = "Hello";char dest[10];strcpy(dest, src); // dest 现在是 "Hello"```3. `strcat()`: 将一个字符串连接到另一个字符串的末尾。
```cchar src1[] = "Hello";char src2[] = ", World!";strcat(src1, src2); // src1 现在为 "Hello, World!" ```4. `strcmp()`: 比较两个字符串。
```cchar str1[] = "Hello";char str2[] = "World";if (strcmp(str1, str2) < 0) {printf("str1 is less than str2\n");} else if (strcmp(str1, str2) > 0) {printf("str1 is greater than str2\n");} else {printf("str1 is equal to str2\n");}```5. `strstr()`: 在字符串中查找子字符串。
_bstr_t 类型,BSTR类型和CString类型到底有什么区别
bstr_t类型到底是类型呢?用的时候也可以直接_bstr_t bstr="abcd";还可以_bstr_t bstr="abcd";CString str=(char *)bstr;//_bstr_t莫非是指针?指针可以赋常量字符串?我在ADO数据库编程中用如下语句:CString str=(m_RecordSet->GetCollect("Name")).bstrV al;//m_RecordSet是_RecordsetPtr类型(m_RecordSet->GetCollect("Name")).bstrV al是BSTR类型说明BSTR可以直接赋给CString类型,从编译器中得知BSTR是unsigned short*类型,怎么可以直接赋给CString对象呢?实在不清楚这三个的本质区别,请高手指点!网友回复:CString str=(char *)bstr;//_bstr_t莫非是指针?指针可以赋常量字符串?\_bstr_t有这几个成员operator const wchar_t*( ) const throw( );operator wchar_t*( ) const throw( );operator const char*( ) const;operator char*( ) const;网友回复:我搜集的资料:May this can help you.7.关于CString和其他一些自动化类型的相互转换问题.未参考的资源: 在各种字符串类型之间进行转换/zh-cn/library/ms235631.aspx类型类别:CString ,V ARIANT,BSTR,_t_btr,等预备知识:BSTR:根据MSDN,他的内部结构为:4字节的长度前缀(字节单位),字符串(宽),2字节结束标志0x0000.平常的BSTR是指向字符串的第一字节,并非前缀.比如定义BSTR myBstr=L”I am a happy BSTR”,这样其实不正确,并没有正确生成前缀.应该这样: BSTR MyBstr = SysAllocString(L"I am a happy BSTR");这样就会在内存分配时就会加上前缀和结束标志.BSTR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。
C语言中的字符串操作技巧
C语言中的字符串操作技巧C语言是一种流行的编程语言,广泛应用于系统编程和嵌入式开发中。
在C语言中,字符串操作是很常见的任务,因此掌握一些字符串操作的技巧将有助于提高编程效率和代码质量。
1. 字符串的基本操作在C语言中,字符串是以字符数组的形式存储的,可以用字符指针来访问和操作字符串。
常见的字符串操作包括字符串赋值、字符串比较、字符串连接等。
例如,可以使用strcpy函数将一个字符串赋值给另一个字符串,使用strcmp函数比较两个字符串是否相等,使用strcat函数将两个字符串连接起来。
另外,还可以使用strlen函数获取字符串的长度,使用strchr函数在字符串中查找指定字符的位置,使用strstr函数在字符串中查找子串的位置等操作。
2. 字符串的拷贝与连接在C语言中,可以使用strcpy函数对字符串进行拷贝操作,将一个字符串复制到另一个字符串中。
但需要注意的是,要确保目标字符串有足够的空间来存储被拷贝的字符串,以避免发生内存越界的问题。
另外,如果需要将两个字符串连接起来,可以使用strcat函数,将第二个字符串连接到第一个字符串的末尾。
同样,需要保证目标字符串有足够的空间来存储连接后的字符串。
3. 字符串的分割与拼接有时候需要对字符串进行分割或拼接操作,可以使用strtok函数来分割字符串。
strtok函数将会以指定的分隔符分割字符串,并返回下一个分割后的子串。
可以利用循环来依次获取所有分割后的子串,实现字符串的分割操作。
另外,如果需要将多个字符串拼接成一个字符串,可以使用sprintf函数。
sprintf函数类似于printf函数,但可以将格式化的输出保存到一个字符串中,方便对多个字符串进行拼接操作。
4. 字符串的查找和替换如果需要在字符串中查找特定的字符或子串,可以使用strchr和strstr函数来实现。
strchr函数用于查找字符串中的指定字符,返回找到的字符指针;而strstr函数用于查找字符串中的子串,返回找到的子串的指针。
C语言字符串处理常用函数和操作
C语言字符串处理常用函数和操作C语言是一门广泛应用于系统程序开发和嵌入式系统编程的高级编程语言。
在C语言中,字符串是常见的数据类型,处理字符串是编程过程中不可避免的任务之一。
本文将介绍一些常用的C语言字符串处理函数和操作。
1. 字符串长度计算字符串的长度是指字符串中字符的个数。
在C语言中,使用strlen 函数可以计算字符串的长度。
其函数原型为:```size_t strlen(const char *str);```其中,str是指向以空字符 '\0' 结束的字符数组的指针,函数返回字符串的长度。
2. 字符串拷贝字符串的拷贝操作是将一个字符串的内容复制到另一个字符串中的操作。
C语言提供了strcpy函数用于字符串拷贝。
其函数原型为:```char *strcpy(char *dest, const char *src);```其中,dest是目标字符串的指针,src是源字符串的指针。
函数将源字符串复制到目标字符串,并返回目标字符串的指针。
3. 字符串连接字符串连接操作将两个字符串连接成一个新的字符串。
C语言提供了strcat函数用于字符串连接。
其函数原型为:```char *strcat(char *dest, const char *src);```其中,dest是目标字符串的指针,src是源字符串的指针。
函数将源字符串连接到目标字符串的末尾,并返回目标字符串的指针。
4. 字符串比较字符串比较操作用于判断两个字符串是否相同。
C语言提供了strcmp函数用于字符串比较。
其函数原型为:```int strcmp(const char *str1, const char *str2);```其中,str1和str2是两个待比较的字符串指针。
函数返回一个整数值,若str1小于str2,则返回负数;若str1等于str2,则返回零;若str1大于str2,则返回正数。
5. 字符串查找字符串查找操作用于在一个字符串中查找指定的子串。
C语言字符串处理技巧(sscanf、strstr等用法)
C语⾔字符串处理技巧(sscanf、strstr等⽤法)之前有项⽬需要对⽇志进⾏⼤量提取和分析操作,除正则表达式这⼀强⼤的⼯具外,若是来不及学习正则表达式,⼜迫切地需要提取字符串。
可以利⽤C语⾔⾃带的⼏个字符串处理函数来搞定。
但必须注意符号、空格和换⾏符的细节问题。
sscanf的⽤法int sscanf(const char *buffer,const char *format,[argument ]...);根据format定义的形式,截取符合该形式的值,格式化输出到之后的传⼊的参数中。
sscanf⽀持正则,功能丰富,但必须注意的是:匹配条件⽐较苛刻,⼀旦未获取到参数极易引起段错误。
⼀定要注意传⼊的必须是地址。
错误例⼦:char * test = "ABCDE10FG\n";int num = 0;sscanf(test,"ABCDEF%dFG",num);printf("num is %d\n",num);程序结果:写⼊位置 0x00000000 时发⽣访问冲突⼀定要注意sscanf传⼊的必须是地址。
正确⽤法:char * test = "ABCDE10FG\n";int num = 0;sscanf(test,"ABCDEF%dFG",&num);printf("num is %d\n",num);sscanf截取字符串除截取数字⽐较⽅便外,sscanf也可截图字符串中的字符,但⽤法上有需要注意:简单的%s输出格式化字符串不好⽤。
举例:char * test = "ABCDE10FG\n";int num = 0;char target[4];sscanf(test,"ABCDEF%d%sG",%num,target);printf("num is :%d,targetis :%s\n",num,target);我们期待target的值是”F“,但实际上的输出是:”FG\n“,因为sscanf遇到%s的时候,直接将后边的所有字符串赋给了char,不会截取其中的内容,⽽且除了截取的内容与期望不符外,如果字符串赋值越界,则直接引起栈错误。
c++ string的常用方法及其功能
C语言中字符串的常用方法及其功能如下:
1. strlen(s):返回字符串s的长度,不包括空字符'\0'。
2. strcpy(dest, src):将字符串src复制到字符串dest中,包括空字符'0'。
3. strcat(dest, src):将字符串src连接到字符串dest的末尾,包括空字符'\0'。
4. strcmp(s1, s2):比较两个字符串s1和s2,如果相等则返回0,如果s1小于s2则返回负数,如果s1大于s2则返回正数。
5. strchr(s, c):查找字符c在字符串s中的位置,如果找到则返回指向该字符的指针,否则返回NULL。
6. strstr(s1, s2):查找子串s2在字符串s1中的位置,如果找到则返回指向该子串的指针,否则返回NULL。
7. strtok(s, delim):将字符串s按照分隔符delim分割成多个子串,并返回第一个子串的指针,后续可以通过调用strtok(NULL, delim)继续获取其他子串。
8. sprintf(s, format, ...):将格式化的数据写入字符串s中,类似于printf函数。
9. snprintf(s, size, format, ...):将格式化的数据写入字符串s中,但最多写入size-1个字符,以防止缓冲区溢出。
LPSTR、LPWSTR、CString编程中各种字符串
BSTR、LPSTR、LPWSTR、CString、VARIANT、COleVariant 、_variant_t……相互转化<转载>武宏伟 .cn/longbao617 2011-03-30 19:09:35char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。
Windows为了消除各编译器的差别,重新定义了一些数据类型,你提到了另外几个类型都是这样。
CHAR为单字节字符。
还有个WCHAR为Unicode字符,即不论中英文,每个字有两个字节组成。
如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。
LPCSTR相当于CONST CHAR * 和LPSTR 相当于CHAR *。
LPSTR、LPCSTR相当于char *,所以这种类型变量的赋值等同于char *的赋值。
Ex1: LPSTR lpstrMsg = "I'm tired.";Ex2: char strMsg[]="I'm tired.";LPSTR lpstrMsg = (LPSTR) strMsgBSTR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。
它被描述成一个与自动化相兼容的类型。
由于操作系统提供相应的API函数(如SysAllocString)来管理它以及一些默认的调度代码,因此BSTR实际上就是一个COM字符串,但它却在自动化技术以外的多种场合下得到广泛使用。
LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。
LPSTR被定义成是一个指向以NULL(‘\0’)结尾的8位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针。
在VC++中,还有类似的字符串类型,如LPTSTR、LPCTSTR等。
基本的 CString 操作
基本的 CString 操作本文解释基本的 CString 操作,包括:∙从标准 C 字符串创建 CString 对象∙访问 CString 中的单个字符∙串接两个 CString 对象∙比较 CString 对象CString类提供成员函数和重载运算符,它们可以复制(在某些情况下甚至超越)C 运行时库的字符串服务(例如strcat)。
从标准 C 字符串创建 CString 对象可将 C 样式的字符串分配给一个CString,就像可将一个CString对象分配到另一个CString对象一样:∙将 C 字符串的值分配到CString对象:CString myString = "This is a test";∙将一个CString的值分配到另一个CString对象:CString oldString = "This is a test";CString newString = oldString;将一个CString对象分配到另一个CString对象时,将复制该CString 对象的内容。
因此,两个字符串不会共享一个对组成字符串的实际字符的引用。
有关使用CString对象作为值的更多信息,请参见文章CString 语义。
注意若要编写应用程序,以便为 Unicode 或 ANSI 对其进行编译,请使用 _T 宏来编写字符串的代码。
有关更多信息,请参见文章Unicode 和多字节字符集 (MBCS) 支持。
访问 CString 中的单个字符可使用GetAt和SetAt成员函数来访问CString对象中的单个字符。
还可使用数组元素、下标、运算符 ( [])(而不是GetAt)来获取单个字符,这与按索引来访问数组元素相似,正如在标准的 C 样式字符串中那样)。
CString字符的引索值是从零开始的。
并置两个 CString 对象要并置两个CString对象,请使用串联运算符(+或+=),如下所示:CString s1 = "This "; // Cascading concatenations1 += "is a ";CString s2 = "test";CString message = s1 + "big " + s2;// Message contains "This is a big test".必须至少有一个串联运算符(+或+=)的参数是CString对象,但是能够为其他参数使用常数字符串(如 "big")或char(如“x”)。
VC中BSTR、Char和CString类型的转换
VC中BSTR、Char*和CString类型的转换当我们使用 ActiveX 控件编程时,经常需要用到将某个值表示成BSTR 类型。
BSTR是Basic字符串(Basic String)或二进制字符串(binary string)的缩写,它实际上是一个指向宽字符串指针。
COM为了各语言之间进行字符串传递而产生的一个字符串类型!适合哪些场合使用呢。
在COM组件的接口上使用,是COM组件字符串的标准传送格式,相当于VB的String类型。
BSTR跟普通字符串还有一个区别就是他的开头保存有该字符串的长度。
1、char*转换成CString若将char*转换成CString,除了直接赋值外,还可使用CString::format 进行。
例如:char chArray[] = "This is a test";char * p = "This is a test";或LPSTR p = "This is a test"; 或在已定义Unicode应的用程序中TCHAR * p = _T("This is a test");或LPTSTR p = _T("This is a test");CString theString = chArray;theString.format(_T("%s"), chArray);theString = p;2、CString转换成char*若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:方法一,使用强制转换。
例如:CString theString( "This is a test" );LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;方法二,使用strcpy。
例如:CString theString( "This is a test" );LPTSTR lpsz = new TCHAR[theString.GetLength()+1];_tcscpy(lpsz, theString); 需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。
LPCTSTR、LPTSTR、_T和CString几种类型的区别
LPCTSTR、LPTSTR、_T和CString几种类型的区别首先要说的是_T不是类型,是一种宏!_T是提供给开发者方便的编写在Unicode、MBCS、ANSI等环境下都适用的宏,编译器自然会解释它,我们只要每个字符串都用上它就不用管了。
在 UNICODE定义的工程里,_T("this string") 被解释为L"this string" 。
其他工程里被解释为"this string"LPCTSTR、LPTSTR和CString主要是应用场合不同:,需要对字符串作复杂处理,用CString合适;,函数参数需要调用某字符串值而不需改变它,用LPCTSTR合适; 例如定义函数 OpenMyFile(LPCTSTR FileName) ,函数参数需要调用某字符串值而在函数中可能改变,用&CString; 例如定义函数 GetMyName(CString &strMyName) ,函数参数需要调用某指向字符串的非常数指针,用LPTSTR和 CString的GetBuffer合适。
例如函数 DoSomeThing(char *pSome),调用时可以用CString Str1(_T"asdfasdf"); //可以用Str1作些查找、替换的活 LPTSTR pMyVal=Str1.GetBuffer(-1); DoSomeThing(pMyVal);Str1.ReleaseBuffer();用下面这个函数可以看看几种类型的使用。
有些东西例如暂时变量释放引起指针指向值的变化、字符串空间申请与释放还得啃MSDNCString ChangeStr(LPCTSTR pcstr, LPTSTR pstr,CString str,CString&str_ref){CString tempstr;tempstr=pcstr; pcstr=_T("asdf"); tempstr=pstr; pstr=_T("asdf"); tempstr=str; str=_T("asdf"); tempstr=str_ref; str_ref=_T("asdf"); return tempstr;}void teststr(){LPCTSTR pcStr=_T("generic data1"); LPTSTR pStr=_T("generic data2"); CString Str=_T("generic data3"); CString Str1=_T("generic data4"); CString Str2;pcStr=_T("generic data01");pStr=_T("generic data02");Str=_T("generic data03");Str2=ChangeStr(pcStr,pStr,Str,Str1); pcStr=Str;pStr=Str.GetBuffer();}举个例子:CString="me"和 CString =_T("me")非UNICODE 下,等价.UNICODE 下,不._T 是宏, 它的存在是为了方便 ANSI 和 UNICODE 字符间的转换LPCTSTR 是 const 类型CString 操作方便补充:Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。
VC中的字符串
字符集及编码
• UNICODE:统一码,每个字符用2个字节表 示,可以为每种语言中的每个字符设定了 统一并且唯一的二进制编码,以满足跨语 言、跨平台进行文本转换、处理的要求。 例如”中文ABC”占用12个连续字节。 • 在VC IDE开发环境中,使用如下条件编译使 用不同的字符集:
– 无编译选项,使用ANSI字符集 – _MBCS,使用MBCS字符集 – _UNICODE,使用UNICODE字符集
字符串处理类
• std::string:ATL中封装char*的字符串类。 • std::wstring: ATL中封装WCHAR*的字符串 类。 • CString:MFC中封装TCHAR*的字符串类。 • CComBSTR:ATL中封装BSTR的字符串类。 • _bstr_t: BSTR的封装类,相当于一个带有 引用计数的智能指针。
字符串处理类
字符串操作 获得字符个数 字符串比较 字符串拷贝 字符串叠加 查找子串 获得字串 返回字符串数据 字符串格式化 std::string/ std::wstring length() >、==、<操作 符 =操作符 +操作符 find(), rfind() substr() c_str() \ CString GetLength() >、==、<操作 符 =操作符 +操作符 Find(), ReverseFind() Mid() GetBuffer() Format() CComBSTR Length() >、==、<操作 符 =操作符 +操作符 \ \ m_str \ _bstr_t length() >、==、<操作 符 =操作符 +操作符 \ \ GetBSTR() \
C语言字符串操作总结大全
C语言字符串操作总结大全
1. 字符串长度:strlen(函数可以返回一个字符串的长度,即字符串
中字符的个数。
2. 字符串复制:strcpy(函数可以将一个字符串复制到另一个字符串中。
3. 字符串连接:strcat(函数可以将两个字符串连接起来,将第二个
字符串追加到第一个字符串的末尾。
4. 字符串比较:strcmp(函数可以比较两个字符串的大小关系,返回
值为0表示两个字符串相等,大于0表示第一个字符串大于第二个字符串,小于0表示第一个字符串小于第二个字符串。
5. 字符串查找:strstr(函数可以在一个字符串中查找另一个字符串,返回值为第二个字符串在第一个字符串中的位置,如果找不到,则返回NULL。
6. 字符串分割:strtok(函数可以将一个字符串按照指定的分隔符进
行分割,返回值为分割后的子字符串。
7. 字符串替换:strreplace(函数可以将一个字符串中的一些子字符
串替换为另一个字符串。
8. 字符串转换:sprintf(函数可以将其他类型的数据转换为字符串,例如将整数转换为字符串。
9. 字符串大小写转换:toupper(函数可以将一个字符串中的所有小
写字母转换为大写字母,tolower(函数可以将一个字符串中的所有大写字
母转换为小写字母。
10. 字符串格式化:printf(函数可以将一个格式化的字符串输出到屏幕上,sprintf(函数可以将一个格式化的字符串保存到一个字符串变量中。
以上是C语言中常用的字符串操作函数,可以根据具体的需求选择合适的函数来进行字符串操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一 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)是一种被鼓励的做法。
三VC常用数据类型使用转换先定义一些常见类型变量借以说明int i = 100;long l = 2001;float f=300.2;double d=12345.119;char username[]="女侠程佩君";char temp[200];char *buf;CString str;_variant_t v1;_bstr_t v2;1、BSTR和char*之间的互相转换CComBSTR、_bstr_t:是对BSTR的封装,BSTR是指向字符串的32位指针。
char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据"); //使用前需要加上头文件comutil.h反之可以使用char *p=_com_util::ConvertBSTRToString(b);2、VARIANT 、_variant_t 与 COleVariantVARIANT:的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,对于不马上赋值的VARIANT,最好先用VoidVariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY。
举个例子:VARIANT va;int a=2001;va.vt=VT_I4; //指明整型数据va.lVal=a; //赋值vt与常用数据的对应关系:unsigned char bVal; VT_UI1short iVal; VT_I2long lVal; VT_I4float fltVal; VT_R4double dblVal; VT_R8VARIANT_BOOL boolVal; VT_BOOLSCODE scode; VT_ERRORCY cyVal; VT_CYDATE date; VT_DATEBSTR bstrVal; VT_BSTRIUnknown FAR* punkVal; VT_UNKNOWNIDispatch FAR* pdispVal; VT_DISPATCHSAFEARRAY FAR* parray; VT_ARRAY|*unsigned char FAR* pbVal; VT_BYREF|VT_UI1short FAR* piVal; VT_BYREF|VT_I2long FAR* plVal; VT_BYREF|VT_I4float FAR* pfltVal; VT_BYREF|VT_R4double FAR* pdblVal; VT_BYREF|VT_R8VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOLSCODE FAR* pscode; VT_BYREF|VT_ERRORCY FAR* pcyVal; VT_BYREF|VT_CYDATE FAR* pdate; VT_BYREF|VT_DATEBSTR FAR* pbstrVal; VT_BYREF|VT_BSTRIUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWNIDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCHSAFEARRAY FAR* FAR* pparray; VT_ARRAY|*VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANTvoid FAR* byref; VT_BYREF_variant_t:是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:long l=222;ing i=100;_variant_t lVal(l);lVal = (long)i;COleVariant:的使用与_variant_t的方法基本一样,请参考如下例子:COleVariant v3 = "字符串", v4 = (long)1999;CString str =(BSTR)v3.pbstrVal;long i = v4.lVal;四、将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD)例如:LPARAM lParam;WORD loValue = LOWORD(lParam); //取低16位WORD hiValue = HIWORD(lParam); //取高16位对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如: WORD wValue;BYTE loValue = LOBYTE(wValue); //取低8位BYTE hiValue = HIBYTE(wValue); //取高8位五 C语言串的基本运算char s1[20]="dir/bin/appl",s2[20]="file.asm",s3[30],*p;int result;1、求串长int strlen(char *s); //求串s的长度【例】printf("%d",strlen(s1)); //输出s1的串长122、串复制char *strcpy(char *to,*from);//将from串复制到to串中,并返回to开始处指针【例】strcpy(s3,s1); //s3="dir/bin/appl",s1串不变3、联接char *strcat(char *to,char *from);//将from串复制到to串的末尾,//并返回to串开始处的指针【例】strcat(s3,"/"); //s3="dir/bin/appl/"strcat(s3,s2); //s3="dir/bin/appl/file.asm"4、串比较int strcmp(char *s1,char *s2);//比较s1和s2的大小,//当s1<s2、s1>s2和s1=s2时,分别返回小于0、大于0和等于0的值【例】result=strcmp("baker","Baker"); //result>0result=strcmp("12","12"); //result=0result=strcmp("Joe","joseph") //result<05、字符定位char *strchr(char *s,char c);//找c在字符串s中第一次出现的位置,//若找到,则返回该位置,否则返回NULL【例】p=strchr(s2,'.'); //p指向"file"之后的位置if(p) strcpy(p,".cpp"); //s2="file.cpp"注意:①上述操作是最基本的,其中后 4个操作还有变种形式:strncpy,strncath和strnchr。
②其它的串操作见C的<string.h>。
在不同的高级语言中,对串运算的种类及符号都不尽相同③其余的串操作一般可由这些基本操作组合而成【例】求子串的操作可如下实现:void substr(char *sub,char *s,int pos,int len){//s和sub是字符数组,用sub返回串s的第pos个字符起长度为len的子串//其中0<=pos<=strlen(s)-1,且数组sub至少可容纳len+1个字符。
if (pos<0||pos>strlen(s)-1||len<0)Error("parameter error!");strncpy(sub,&s[pos],len); //从s[pos]起复制至多len个字符到sub。