c++字符串机理

在windows编程中,由于编码方式的不同和c与c++的不同而造成了许多复杂的有关字符串之间的转换

首先,windows编码方式有ANSCLL和UNICODE,前者是单字符的,后者是双字符的。

然后,char*理所当然是单字符的,string也是单字符的,而CString是Tchar的。

那么什么是TCHAR呢,它在采用ANSCLL的编码中表示单字符,在UNICODE编码中表示双字符,定义如下

如果定义_UNICODE,声明如下:     typedef   wchar_t   TCHAR;

如果没有定义_UNICODE,则声明如下:     typedef   char   TCHAR;

而我们可以采用宏来告诉编译器来以什么编码方式来保存字符常量

_T一般同字常数相关,如_T("Hello"。如果你编译一个 程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T 和_L的区别在于,_L不管你是以什么方式编译,一律UNICODE方式保存.

而根据字符串类型的命名我们也很容易看出LPTSTR、LPCTSTR是Tchar类型的字符串指针LPSTR,LPCSTR是char*的字符串指针,LPWSTR,LPCWSTR是UNIcode编码的字符串指针。

你可以使用Microsoft在ATL里面提供的宏来进行转换
#include <atlbase.h>
USES_CONVERSION;
LPCWSTR pw = T2W("Hello,world!"); // tchar -> wchar
LPCTSTR pt = W2T(L"Hello,world!"); // wchar -> tchar
等等.而LPTSTR与LPSTR是可以进行强制类型转换的,好像在CStrng中定义了这种强制类型转换。这样这三种类型就能相互转换了。

string向char*转换的方式是char*=string.c_str(),

char*向string转换直接赋值就行,应该是隐式的调用了string的构造函数。

string转 CString
CString.format(”%s”, string.c_str());

CString转 string
string s(CString.GetBuffer());

GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.

CString转char *

CString cstr;

char *p =(LPSTR)(LPCTSTR)cstr;

char转 CString
CString.format(”%s”, char*);

c++字符串机理

时间: 2024-11-08 02:06:48

c++字符串机理的相关文章

sizeof、strlen、字符串、数组,整到一块,你还清楚吗?

写在前面 sizeof.strlen.字符串.数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正是帮助大家将相关知识总结清楚. 正文 先看一段代码 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void testchar(char str[]) 5 { 6 printf("%d %d\n", sizeof(str

(1)从正则表达式到有穷自动机,识别字符串(算法思想及代码实现)

正则表达式: 正则表达式是当前主流的字符串识别机制之一,另外一种是文法识别. 和文法相比,正则表达式具有构造相对简单,运行效率较高的特点,所以一般的字符串识别会使用正则表达式. 正则表达式有三种主要运算符是我们在构造词法分析器生成器LEX需要用到的:*.|.连接 *代表闭包运算,假如有一个字符串a,那么a*就代表由任意个字符串a组合成的字符串,包括空串(0个字符串a组合成的字符串),如 *={空串,a,aa,aaa.....} |代表或运算,不同于*闭包运算,|是针对两个字符串的,假如有两个字符

条件、循环、函数定义、字符串操作练习

注意标准库的两种导入与使用方式,建议大家采用<库名>.<函数名>的方式. 对前面的代码进行优化,用for,while,if,def实现: 用循环画五角星 1 import turtle 2 3 turtle.fillcolor("red") 4 turtle.begin_fill() 5 for i in range(5): 6 turtle.forward(100) 7 turtle.right(144) 8 turtle.end_fill() 用循环画同心圆

sql常用格式化函数及字符串函数

一.常用格式化函数 1.日期转字符串 select to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS') //2017-09-18 22:41:50 YYYY:年(4和更多位) MM:月份号(01-12) DD:一个月里的日(01-31) HH24:一天的小时数(00-23) MI:分钟(00-59) SS:秒(00-59) 2.字符串转日期 select to_date('2017-09-18','YYYY-MM-DD') //2017-09-

PHP 格式化字符串sprintf()

字符串函数 sprintf() 函数把格式化的字符串写入一个变量中 函数说明:sprintf(格式, 要转换的字符串)  参考PHP手册 返回: 格式化后的字符串 举例: 如:保留2位小数, $str = '99.9';echo sprintf('%01.2f', $str);结果为:99.90 echo round($str, 2); 结果为:99.9

js中字符串的替换

定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp/substr,replacement)参数 描述 regexp/substr 必需.规定子字符串或要替换的模式的 RegExp 对象. 请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象. replacement 必需.一个字符串值.规定了替换文本或生成替换文本的函数. 返

数组、字符串、集合

数组与集合的转换.数组与字符串的转换 ========数组变集合 String[] arr = {"abc","cc","kkkk"}; //把数组变成list集合有什么好处? /* 可以使用集合的思想和方法来操作数组中的元素. 注意:将数组变成集合,不可以使用集合的增删方法. 因为数组的长度是固定. contains. get indexOf() subList(); 如果你增删.那么会产生UnsupportedOperationExcepti

《Java编程思想》第十三章 字符串

<Java编程思想>读书笔记 1.String作为方法的参数时,会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置,从未动过. 2.显式地创建StringBuilder允许预先为他指定大小.如果知道字符串多长,可以预先指定StringBuilder的大小避免多次重新分配的冲突. 1 /** 2 * @author zlz099: 3 * @version 创建时间:2017年9月1日 下午4:03:59 4 */ 5 public class UsingStringBuilder {

SpringMVC后台使用对象接受参数字符串转日期

在springMVC配置文件中加入: <bean id="dateConvert" class="com.iomp.util.DateConvert"/> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property